如何更换角色"。" Mac终端中0的特定单元格?

时间:2016-10-05 16:20:36

标签: awk sed terminal grep

txt文件如下所示: before 我要这个: after

在:

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}'

因为每行都有一个点。请帮忙。

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)

通过在空格上分割输入行并迭代第2和第3列

,使用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