GNU/Linux >> Linux Esercitazione >  >> Linux

Inserire nuove righe con valori mancanti (na)?

Vorrei inserire nuove righe nei file di testo se mancano dei valori.
Ho ad esempio il seguente file di testo (A.txt), per il quale manca la riga 5. Inoltre, poiché il file dovrebbe avere 12 righe, mancano anche le righe 11-12.

1 2.30
2 3.01
3 3.22
4 3.34
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02

Il mio output previsto è il seguente. Per i casi mancanti va aggiunta una riga con il numero e NA. Come vedi, questo è successo come desiderato alle righe 5, 11 e 12:

1 2.30
2 3.01
3 3.22
4 3.34
5 NA
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02
11 NA
12 NA

Sono in grado di farlo utilizzando il seguente script:

f1=/my-directory/
echo "new file" > "$f1"/newfile.txt  

for i in {1..12}; do
l=$(awk '{print $1}' /"$f1"/A.txt | grep -wE ^$i /"$f1"/A.txt)
if grep --quiet -wE ^$i /"$f1"/A.txt; then echo "$l" >> "$f1"/newfile.txt; else echo "$i NA" >> "$f1"/newfile.txt; fi

done

Questo funziona bene. Il problema è tuttavia che devo farlo per circa 600 file contenenti più di circa 160000 righe. La soluzione ad anello richiederebbe quindi troppo tempo per la ricerca in tutte le linee. La mia domanda è:esiste una soluzione più semplice che potrebbe farlo?

Risposta accettata:

Puoi farlo con un awk sceneggiatura:

awk '{ while (NR + shift < $1) { print (NR + shift) " NA"; shift++ }; print } END { shift++; while (NR + shift < 13) { print (NR + shift) " NA"; shift++ } }' /tmp/test1

produrrà l'output richiesto per /tmp/test1 (sostituiscilo con ogni file che desideri elaborare).

In una forma più leggibile:

#!/usr/bin/awk -f
{
    while (NR + shift < $1) {
        print (NR + shift) " NA"
        shift++
    }
    print
}
END {
    shift++
    while (NR + shift < 13) {
        print (NR + shift) " NA"
        shift++
    }
}

Salvalo come file, ad esempio fill-missing , rendilo eseguibile, quindi puoi semplicemente eseguirlo

./fill-missing /tmp/test1

Lo script elabora ogni riga, tenendo traccia del delta previsto con il numero di riga corrente in shift . Quindi per ogni riga, se la riga corrente regolata non corrisponde al primo numero nella riga, stampa il numero di riga appropriato seguito da NA e incrementa il delta; una volta che i numeri di riga corrispondono, stampa la riga corrente. Al termine del processo stampa le righe mancanti necessarie per arrivare a 12.

Correlati:timeout in uno script di shell?
Linux
  1. Enumerazione di una nuova rete con Nmap

  2. Elimina le righe consecutive in Csv con valori duplicati in un campo, ma mantieni l'ultima riga?

  3. Concatenazione di file e inserimento di una nuova riga tra i file

  4. come inserire una nuova riga se una riga ha più di 60 caratteri

  5. sostituire le righe in un file con le righe in un altro per numero di riga

Come eliminare la riga in Vim su Linux

Tutorial Unix Sed:aggiungi, inserisci, sostituisci e conta righe di file

Come inserire una nuova riga nell'e-mail usando il comando linux mail?

Come inserire una nuova riga nello script della shell di Linux?

sed - inserisce riga dopo X righe dopo la corrispondenza

echo testo con nuova riga in bash