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.