#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