特定のパターンで始まる値のない行だけを取得しようとしています。
入力ファイル(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で動作します。