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'