Ich möchte in Textdateien neue Zeilen einfügen, wenn Werte fehlen.
Ich habe zum Beispiel folgende Textdatei (A.txt), bei der Zeile 5 fehlt. Da die Datei 12 Zeilen haben soll, fehlen außerdem die Zeilen 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
Meine erwartete Ausgabe ist die folgende. Für fehlende Fälle sollte eine Zeile mit der Nummer und NA hinzugefügt werden. Wie Sie sehen, geschah dies wie gewünscht in Zeile 5, 11 und 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
Ich kann dies tun, indem ich das folgende Skript verwende:
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
Das funktioniert gut. Das Problem ist jedoch, dass ich dies für etwa 600 Dateien tun muss, die mehr als etwa 160000 Zeilen enthalten. Die Schleifenlösung würde daher zu viel Zeit in Anspruch nehmen, alle Leitungen zu durchsuchen. Meine Frage ist:Gibt es eine einfachere Lösung, die dies tun könnte?
Akzeptierte Antwort:
Sie können dies mit einem awk
tun Skript:
awk '{ while (NR + shift < $1) { print (NR + shift) " NA"; shift++ }; print } END { shift++; while (NR + shift < 13) { print (NR + shift) " NA"; shift++ } }' /tmp/test1
erzeugt die erforderliche Ausgabe für /tmp/test1
(Ersetzen Sie das mit jeder Datei, die Sie verarbeiten möchten).
In besser lesbarer Form:
#!/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++
}
}
Speichern Sie dies als Datei, sagen Sie fill-missing
, mach es ausführbar, dann kannst du es einfach ausführen
./fill-missing /tmp/test1
Das Skript verarbeitet jede Zeile und verfolgt das erwartete Delta mit der aktuellen Zeilennummer in shift
. Wenn also die aktuell angepasste Zeile nicht mit der ersten Zahl in der Zeile übereinstimmt, wird für jede Zeile die entsprechende Zeilennummer gefolgt von NA
ausgegeben und erhöht das Delta; Sobald die Zeilennummern übereinstimmen, wird die aktuelle Zeile gedruckt. Am Ende des Vorgangs werden alle fehlenden Zeilen gedruckt, die erforderlich sind, um 12 zu erreichen.