Как заменить символ «.» определенной ячейки на 0 в терминале Mac?

#awk #sed #terminal #grep

#awk #sed #терминал #grep

Вопрос:

Текстовый файл выглядит так: перед тем, как я хочу это: после

Перед:

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

потому что в каждой строке есть точка. Пожалуйста, помогите.

Ответ №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 , гарантирует, что разделители установлены на tab перед печатью строки.

Ответ №2:

 $ 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
  

Ответ №3:

с perl помощью разделения строки ввода на пробелы и итерации по 2-му и 3-му столбцам

 $ 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
  

Ответ №4:

     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