
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 name
oder (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 Arraybad
unter dem Schlüssel der ersten beiden Spalten einen Eintrag hinzu. Anschließend überspringen wir die restlichen Befehle und springen zum Neustart dernext
Zeile.!(($1,$2) in bad)
Wenn die ersten beiden Spalten der aktuellen
$1,$2
Zeilenichtunter den Schlüsseln vonbad
, dann drucken Sie diese Zeile.