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

Bal*_*ala 3 linux awk text-processing

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

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
Run Code Online (Sandbox Code Playgroud)

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

预期产出

TEST|RALPH|JACKSON|2|3|1
TEST|DAVE|KNIGHT|1|3|1
Run Code Online (Sandbox Code Playgroud)

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

awk -F "|" '$4 != 0 && $5 !=0 && $6 !=0' input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 5

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

但是,如果您想测试更多的列,例如第 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
Run Code Online (Sandbox Code Playgroud)

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