我有一个unix的问题。我有一个如下所示的文件:
AAAA 0 1 2 2 0
BBBBB 2 2 2 2 2
CCCCC 1 1 0 1 1
DDDD 0 0 0 0 0
EEEEE 2 2 0 2 2该文件有数千行,如下图所示(也是以制表符分隔的)。文件的第一列是名称,第二到第六列是数据。重要的是第2-6栏中的信息。我需要输出第2-6列不超过10(零)的所有行。例如,我希望输出如下所示:
BBBBB 2 2 2 2 2
CCCCC 1 1 0 1 1
EEEEE 2 2 0 2 2我一直在尝试用尽可能简单的方法来完成这项工作,并尝试了以下awk命令:
awk 'BEGIN{out!=0;}{if($2!=0)out++;if($3!=0)out++;if($4!=0)out++;if($5!=0)out++;if($6!=0)out++;if (out>=4)print;}'但是,当我尝试这样做时,它只给出了原始的输入文件。我不确定哪里出了问题,或者我是否采取了正确的方法。任何帮助都将不胜感激。
发布于 2012-06-21 08:04:24
您正在做的错误是没有为每个记录重置out变量,而是只在BEGIN块中初始化它一次。(您还错误地使用"not equals“来初始化它。)
awk '{out = 0; if($2!=0) out++; if($3!=0) out++; if($4!=0) out++; if($5!=0) out++; if($6!=0) out++; if(out>=4) print}'发布于 2012-06-21 08:36:26
使用perl的一种方式
perl -ne 'print if(tr/0/0/ <= 1)' file.txt我假设每行的名称不包含数字(特别是0),并且长度不超过一位数。此外,如果添加-i标志,则可以在文件中进行更改。
发布于 2012-06-21 09:05:35
awk '
{
nzero=0
for (fld = 2; nzero <= 1 && fld <= 6; fld++) {
if ($fld == 0) nzero++
}
if (nzero <= 1) print
}
' filenamehttps://stackoverflow.com/questions/11129827
复制相似问题