如何获取管道分隔文件中没有以特定模式开头的值的行?

如何获取管道分隔文件中没有以特定模式开头的值的行?

我试图只获取没有以特定模式开头的值的行。

输入文件(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。

相关内容