特定のパターンで始まる値のないパイプで区切られたファイルから行を取得する方法は?

特定のパターンで始まる値のないパイプで区切られたファイルから行を取得する方法は?

特定のパターンで始まる値のない行だけを取得しようとしています。

入力ファイル(test_file.txt)

USER1|AR-45233|
USER4|AR-32133|
USER1|45232|
USER1|AF-45233|
USER2|AR-12321|
SYSTEM1|A9-12312|
USER1|AP-67655|

期待される出力(test_filtered.txt)

USER1|45232|
SYSTEM1|A9-12312|

私はこれを試しましたが、効果があるようです。同じ目標を達成するためのより良い方法はありますか?

awk -F "|" '{if ($2!~/AP-/ && $2!~/AR-/ && $2!~/AF-/) {print $0}}' test_file.txt > test_filtered.txt

上記のような基準に合わないラインを抽出して、このように別のファイルに書きたいのですが、そうすることができないので、このように質問します。

awk -F "|" '{if ($2~/AP-/ && $2~/AR-/ && $2~/AF-/) {print $0}}' test_file.txt > test_to_remove.txt

答え1

ミラーの使用(https://github.com/johnkerl/miller) はい

mlr --csv --fs "|" --implicit-csv-header --headerless-csv-output filter -x -S '$2=~"^A[RFP]-"' input >output

答え2

$  grep -v '|A[PRF]-' test_file.txt 

grepベースのソリューションです。

$ sed -e '/^[^|]*[|]A[PRF]-/d' test_file.txt > test_filtered.txt

入力の幅が2つのフィールドの場合は、次のことができます。

$ sed -e '/[|]A[PRF]-/d' test_file.txt > test_filtered.txt

注:[|]簡単な内容でも| 十分ですが、書いています。これは、変更なしで正規表現モードと拡張正規表現モードの両方で動作するようにするためです。 IOW、これはPOSIXとGNU sed xtended regexで動作します。

関連情報