我有一个管道分隔文件,如下所示
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