GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Neue Zeilen mit fehlenden Werten einfügen (na)?

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.

Verwandte:Zeitüberschreitung in einem Shell-Skript?
Linux
  1. Auflisten eines neuen Netzwerks mit Nmap

  2. Zeilenbereich durch Zeilenbereich ersetzen (sed oder andere)?

  3. Wie zeigt man mit dem Linux-Befehl „cat“ nur bestimmte Zeilen nach Nummer an?

  4. Ersetzen Sie Linien, die einem Muster entsprechen, durch Linien aus einer anderen Datei in der richtigen Reihenfolge?

  5. Zeilenumbruch mit Mc verwenden?

So löschen Sie eine Zeile in Vim unter Linux

Unix Sed Tutorial:Dateizeilen anhängen, einfügen, ersetzen und zählen

Verketten von Dateien und Einfügen einer neuen Zeile zwischen Dateien

Wie füge ich mit dem Linux-Mail-Befehl eine neue Zeile in die E-Mail ein?

Wie füge ich eine neue Zeile in ein Linux-Shell-Skript ein?

wie man eine neue Zeile einfügt, wenn eine Zeile mehr als 60 Zeichen hat