while ループは時間がかかるので使用できません。Linux で最終ファイルを取得するより速い方法はありますか?

while ループは時間がかかるので使用できません。Linux で最終ファイルを取得するより速い方法はありますか?
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は、この行を出力します。

関連情報