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
このコマンドを使用しています
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
しかし、whileループを使用するにはデータが多すぎるため、whileループを使用して猫を作成するのに時間がかかります。"grep -vf file_1 file_2"
このようなものを使用するのと同じように、このタスクをすばやく実行する他の方法はありますか?教えてください。
ここで使用するロジックは、パターンの一番上の行を取得し、パターンが各行であることを見つけることです。"file_1.txt"
答え1
name
(a)その行に含まれるもの、または(b)その行の最初の2列が含まれている前の行と同じでない限り、あなたのコードはfile_1.txtのすべての行を印刷するようですname
。その場合は、以下を試してください。
$ awk '/name/{bad[$1,$2];next} !(($1,$2) in bad)' file_1.txt
150 300
150 300
150 250
150 250
どのように動作しますか?
/name/{bad[$1,$2];next}
現在の行に以下が含まれている場合は、最初の2つの列のキーの下の連想配列
name
に項目を追加します。bad
次に、残りのコマンドをスキップして再起動するためにその行に移動しますnext
。!(($1,$2) in bad)
現在の行の最初の2
$1,$2
列いいえキーをbad
押してからこの行を印刷します。