在:
2262493 565.7 1315.5 3617.0
2262494 488.3 1458.8 3445.0
2262495 366.0 1642.7 3269.0
2262496 . . 0.0
后:
2262493 565.7 1315.5 3617.0
2262494 488.3 1458.8 3445.0
2262495 366.0 1642.7 3269.0
2262496 0 0 0.0
我需要用.
替换第2和第3列中的0
。我无法使用此awk命令执行此操作:
awk '{gsub(".","0",$2); print $1"\t"$2"\t"$3"\t"$4}'
因为每行都有一个点。请帮忙。
答案 0 :(得分:1)
$ cat file
1.2 3.14 7.49 21.37
4.2 . . 0.0
$ awk -v OFS="\t" '$2=="."{$2=0} $3=="."{$3=0} {$1=$1}1' file
1.2 3.14 7.49 21.37
4.2 0 0 0.0
如果第二列和/或第三列是"。",则设置为" 0"。最后一位{$1=$1}1
确保在打印行之前将分隔符设置为制表符。
答案 1 :(得分:0)
$ cat script.awk
#{for(i=NF;i>0;i--) # loop it backwards save a byte
{for(i=3;i>1;i--) # oh it was only fields 2 and 3
sub(/^\.$/,0,$i) # sub lonely periods with zeros
} 1 # one outputs zeros and more
运行它:
$ awk -f script.awk jas\'s_file.txt
1.2 3.14 7.49 21.37
4.2 0 0 0.0
答案 2 :(得分:0)
perl
$ cat file
. 3.14 7.49 21.37
4.2 . . 0.0
$ perl -nale 'foreach (@F[1..2]){ $_ = "0" if $_ eq "." } print join"\t",@F' file
. 3.14 7.49 21.37
4.2 0 0 0.0
或者,使用正则表达式
$ perl -nale 'foreach (@F[1..2]){ $_ = "0" if /^\.$/ } print join"\t",@F' file
. 3.14 7.49 21.37
4.2 0 0 0.0
答案 3 :(得分:0)
cat file
2262493 565.7 1315.5 3617.0
2262494 488.3 1458.8 3445.0
2262495 366.0 1642.7 3269.0
2262496 . . 0.0
awk 'sub(/^\.$/,"0",$2)sub(/^\.$/,"0",$3){print $1,$2" "$3"\t"$4}' file
2262493 565.7 1315.5 3617.0
2262494 488.3 1458.8 3445.0
2262495 366.0 1642.7 3269.0
2262496 0 0 0.0