
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}
現在の行に が含まれている場合
name
、最初の 2 列のキーの下の連想配列にエントリを追加しますbad
。その後、残りのコマンドをスキップして、行の最初からやり直しますnext
。!(($1,$2) in bad)
現在の行の最初の2列
$1,$2
がないのキーの中にある場合bad
は、この行を出力します。