Awk 如何删除全部为零的字段

Awk 如何删除全部为零的字段,awk,cut,Awk,Cut,我有一个文件如下所示: header,d0,d1,d2,d3, ... s1,0,5,2,8, ... s2,0,8,2,4, ... s3,0,7,3,4, ... s4,0,3,2,1, ... ... 我想删除所有带0的列,比如d0 我可以手动检查所有为零的列,找到d0并执行 cut -d "," -f 1,3- file> file_revised 所需输出为 header,d1,d2,d3, ... s1,5,2,8, ... s2,8,2,4, ... s3,7,3,4

我有一个文件如下所示:

header,d0,d1,d2,d3, ...
s1,0,5,2,8, ...
s2,0,8,2,4, ...
s3,0,7,3,4, ...
s4,0,3,2,1, ...
...
我想删除所有带0的列,比如d0 我可以手动检查所有为零的列,找到d0并执行

cut -d "," -f 1,3- file> file_revised  
所需输出为

header,d1,d2,d3, ...
s1,5,2,8, ...
s2,8,2,4, ...
s3,7,3,4, ...
s4,3,2,1, ...
...
但由于我有这么多的列,很难手动检查。 如何自动删除所有为零的列?
谢谢。

如果第一列不包含所有零,那么此awk脚本应该可以完成这项工作

$ cat file
header,d0,d1,d2,d3
s1,0,5,2,8
s2,0,8,2,4
s3,0,7,3,4
s4,0,3,2,1
$
$ cat tst.awk
NR==1 {
    for (i=1; i<=NF; ++i)
        a[i]
    next
}
NR==FNR {
    for (i in a)
        if ($i != "0")
            delete a[i]
    next
}
{
    sep = ""
    out = ""
    for (i=1; i<=NF; ++i) {
        if (i in a)
            continue
        out = out sep $i
        sep = FS
    }
    print out
}
$
$ awk -F, -f tst.awk file file
header,d1,d2,d3
s1,5,2,8
s2,8,2,4
s3,7,3,4
s4,3,2,1
awk -F',' '(NR==FNR && NR >1){for(i = 1; i <= NF; i++)
                              {a[i] = a[i]+$i}}
           (FNR!=NR){out=$1
                     for(i = 2; i<= NF; i++){
                      if(a[i]!=0){out=out","$i}
                     }
                    print out
                    }' file_name file_name
脚本作为输出输出

header,d
s1,5,2,8
s2,8,2,4
s3,7,3,4
s4,3,2,1

如果第一列不包含所有零,则此awk脚本应执行此任务

awk -F',' '(NR==FNR && NR >1){for(i = 1; i <= NF; i++)
                              {a[i] = a[i]+$i}}
           (FNR!=NR){out=$1
                     for(i = 2; i<= NF; i++){
                      if(a[i]!=0){out=out","$i}
                     }
                    print out
                    }' file_name file_name
脚本作为输出输出

header,d
s1,5,2,8
s2,8,2,4
s3,7,3,4
s4,3,2,1
也许您可以使用如下sed命令:

$ sed 's/\b0\,\b//g' test.txt
header,d0,d1,d2,d3
s1,5,2,8
s2,8,2,4
s3,7,3,4
s4,3,2,1
也许您可以使用如下sed命令:

$ sed 's/\b0\,\b//g' test.txt
header,d0,d1,d2,d3
s1,5,2,8
s2,8,2,4
s3,7,3,4
s4,3,2,1

下面是一个将要打印到变量p=$1,$3的字段集合。。。等,并使用系统调用awk打印p:


如果所有字段都是零,则p=print,并且整个文件都将被打印。

这里是一个将要打印的字段聚集到变量p=$1,$3。。。等,并使用系统调用awk打印p:

如果所有字段都是零,则p=print,整个文件都将被打印。

使用Perl

> cat sumin.txt
header,d0,d1,d2,d3
s1,0,5,2,8
s2,0,8,2,4
s3,0,7,3,4
s4,0,3,2,1
> cat rem_zero.sh
perl -F, -lane '
@FH=@F if $.==1;

if($.>1)
{
$F[$_] and $nz[$_]||=1 for 0..$#F;
push(@L,[@F]);
}

END {
@cols = grep $nz[$_], 0..$#nz;
print join(",",@FH[@cols]);
for my $line (@L) { print "@{$line}[@cols]" }
}

' $1
> rem_zero.sh sumin.txt
header,d1,d2,d3
s1 5 2 8
s2 8 2 4
s3 7 3 4
s4 3 2 1
>
使用Perl

> cat sumin.txt
header,d0,d1,d2,d3
s1,0,5,2,8
s2,0,8,2,4
s3,0,7,3,4
s4,0,3,2,1
> cat rem_zero.sh
perl -F, -lane '
@FH=@F if $.==1;

if($.>1)
{
$F[$_] and $nz[$_]||=1 for 0..$#F;
push(@L,[@F]);
}

END {
@cols = grep $nz[$_], 0..$#nz;
print join(",",@FH[@cols]);
for my $line (@L) { print "@{$line}[@cols]" }
}

' $1
> rem_zero.sh sumin.txt
header,d1,d2,d3
s1 5 2 8
s2 8 2 4
s3 7 3 4
s4 3 2 1
>

请在你的问题中添加你想要的输入样本的输出。我明白了,你自己已经尝试过了。我会编辑我的帖子。非常感谢。请在你的问题中添加你想要的输入样本的输出。我明白了,你自己已经尝试过了。我会编辑我的帖子。非常感谢。这将删除所有包含零的单元格,最后一列中的单元格除外。OP希望删除包含所有零的列。如果零也在最后一列中,则可以尝试使用“s/\b0、\b\\b、0\b//g”,这将删除除最后一列中的单元格以外的所有包含零的单元格。OP希望删除包含所有零的列。如果零也在最后一列中,则可以尝试使用's/\b0、\b\\b、0\b//g'