While-Schleife kann nicht verwendet werden, da dies zu lange dauert. Gibt es unter Linux einen schnelleren Weg, um die endgültige Datei abzurufen?

While-Schleife kann nicht verwendet werden, da dies zu lange dauert. Gibt es unter Linux einen schnelleren Weg, um die endgültige Datei abzurufen?
cat file_1.txt

100 200 name

100 200

100 200

150 300

150 300

150 250

150 250

150 300 name


final file should be 

150 300

150 300

150 250

150 250

ich verwende diesen Befehl

cat file_1.txt | grep -v "name">file_2.txt; cat file_2.txt| while read line;do cat file_1.txt| grep "$line"| head -1|grep -v "name" ;done

aber es sind zu viele Daten, ich kann keine While-Schleife verwenden, es dauert zu lange, cat verwendet eine While-Schleife. Gibt es eine andere Möglichkeit, das schneller zu machen, zum Beispiel durch die Verwendung von "grep -vf file_1 file_2"so etwas, durch eine solche Übergabe? Bitte lassen Sie es mich wissen.

hier verwende ich die Logik, die oberste Zeile des gefundenen Musters zu erhalten. Das Muster ist jede Zeile"file_1.txt"

Antwort1

Mir scheint, dass Ihr Code jede Zeile von file_1.txt ausgibt, es sei denn, (a) die Zeile enthält nameoder (b) die ersten beiden Spalten der Zeile sind dieselben wie die vorherige Zeile, die enthielt name. Versuchen Sie in diesem Fall:

$ awk '/name/{bad[$1,$2];next} !(($1,$2) in bad)' file_1.txt 
150 300
150 300
150 250
150 250

Wie es funktioniert

  • /name/{bad[$1,$2];next}

    Wenn die aktuelle Zeile enthält name, fügen wir dem assoziativen Array badunter dem Schlüssel der ersten beiden Spalten einen Eintrag hinzu. Anschließend überspringen wir die restlichen Befehle und springen zum Neustart der nextZeile.

  • !(($1,$2) in bad)

    Wenn die ersten beiden Spalten der aktuellen $1,$2Zeilenichtunter den Schlüsseln von bad, dann drucken Sie diese Zeile.

verwandte Informationen