如何使用 awk 获取管道分隔文件中特定列中具有非零值的行?

如何使用 awk 获取管道分隔文件中特定列中具有非零值的行?

我有一个管道分隔文件,如下所示

TEST|RALPH|JACKSON|2|3|1
TEST|STEVE|PARKER|0|1|1
TEST|MARK|WOODS|0|1|1
TEST|DAVE|KNIGHT|1|3|1
TEST|JOHN|DOE|0|1|1

我想过滤第 4,5 和 6 列中具有非零值的行,并将其写入单独的文件中。

预期产出

TEST|RALPH|JACKSON|2|3|1
TEST|DAVE|KNIGHT|1|3|1

我尝试使用以下 awk 实现此目的

awk -F "|" '$4 != 0 && $5 !=0 && $6 !=0' input.txt > output.txt

我想知道是否有更好的方法使用 awk 来做到这一点。

答案1

你目前的方法是正确的、清晰的,并且按照宣传的那样工作,没有真正需要改变它。

但是,如果您想测试更多列,请说全部第 3 列之后的列,这可能会导致awk程序有点长(如果有很多列)。

另一种方法是使用循环:

$ awk -F '|' '{ for (i=4; i<=NF; ++i) if ($i == 0) next; print }' file
TEST|RALPH|JACKSON|2|3|1
TEST|DAVE|KNIGHT|1|3|1

awk程序测试第 3 列之后的所有列的值,并在找到值为 0 的列时立即跳过当前行。如果没有找到零,则打印当前行。

答案2

#!/usr/bin/python
import subprocess
k=open('k.txt','r')
for i in k:
    h=i.strip().split('|')
        if "0" not in h[-3:]:
            print "|".join(h)
output

python script.py

TEST|RALPH|JACKSON|2|3|1
TEST|DAVE|KNIGHT|1|3|1

相关内容