栏目选择

栏目选择

我需要收集 A、B、D、E 列中至少有一个值不等于 0(零)的行。

下面一张是数据:

                   A      B     C           D        E       G       
ES-N    .    |     0      0     12  |       0        0      100
SES-N   .    |     1      0     10  |       0        0       10
UAS-N   .    |     0      0     10  |       0        0       10
CSS-N   .    |     0      0     10  |       0        5       10
BBE-N   .    |     0      0     15  |       0        0      125

所需输出:

                   A      B     C           D        E       G       
SES-N   .    |     1      0     10  |       0        0       10
CSS-N   .    |     0      0     10  |       0        5       10

请您提供一个可以在unix平台上运行的shell脚本。

我做了下面的操作,但由于 C 和 G 列而没有消除“0”。

#lin is the count of line in the file
for  (( i=1; i<=$lin; i++ ));
do
sed -n -e ""$((ini + 1)),$fin"p"  /file
egrep '1|2|3|4|5|6|7|8|9' /file1
if [[ $? -eq 0 ]]
then
sed -n -e ""$ini"p" /file

答案1

使用 awk:

awk -n '$4 !=0 || $5 != 0 || $8 != 0 || $9 != 0 {print $0}' filename

答案2

简单地说,你也可以这样做:

awk '$4+$5+$8+$9' infile

并保留标题行:

awk 'NR==1 || $4+$5+$8+$9' infile

答案3

@unxnut的awk解决方案更加灵活,但是在您的特定情况下,因为您的要求很简单,并且文件格式也很简单,所以grep也可以这样做。

包含至少一个非零值的行与排除所有这些值都为零的行是同一件事。此grep命令查找包含以下两个实例的行:

  • 竖线后跟空格
  • 零后跟空格
  • 另一个零后跟空格

与该模式的两个实例匹配的任何行(即所有四个值均为零的任何行)都是已删除。显示剩余行:

$ egrep -v '(\|  *0  *0 .*){2}' infile
                   A      B     C           D        E       G       
SES-N   .    |     1      0     10  |       0        0       10
CSS-N   .    |     0      0     10  |       0        5       10

相关内容