我试图只获取没有以特定模式开头的值的行。
输入文件(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。