首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按列过滤文件

按列过滤文件
EN

Stack Overflow用户
提问于 2012-06-21 07:57:24
回答 5查看 1.5K关注 0票数 2

我有一个unix的问题。我有一个如下所示的文件:

代码语言:javascript
复制
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(零)的所有行。例如,我希望输出如下所示:

代码语言:javascript
复制
BBBBB   2   2   2   2   2

CCCCC   1   1   0   1   1

EEEEE   2   2   0   2   2

我一直在尝试用尽可能简单的方法来完成这项工作,并尝试了以下awk命令:

代码语言:javascript
复制
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;}'

但是,当我尝试这样做时,它只给出了原始的输入文件。我不确定哪里出了问题,或者我是否采取了正确的方法。任何帮助都将不胜感激。

EN

回答 5

Stack Overflow用户

发布于 2012-06-21 08:04:24

您正在做的错误是没有为每个记录重置out变量,而是只在BEGIN块中初始化它一次。(您还错误地使用"not equals“来初始化它。)

代码语言:javascript
复制
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}'
票数 2
EN

Stack Overflow用户

发布于 2012-06-21 08:36:26

使用perl的一种方式

代码语言:javascript
复制
perl -ne 'print if(tr/0/0/ <= 1)' file.txt

我假设每行的名称不包含数字(特别是0),并且长度不超过一位数。此外,如果添加-i标志,则可以在文件中进行更改。

票数 0
EN

Stack Overflow用户

发布于 2012-06-21 09:05:35

代码语言:javascript
复制
awk '
  {
    nzero=0
    for (fld = 2; nzero <= 1 && fld <= 6; fld++) {
      if ($fld == 0) nzero++
    }
    if (nzero <= 1) print
  }
' filename
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11129827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档