Awk - заменить один символ только в определенном столбце


13

У меня есть файл, как это:

2018.01.02;1.5;comment 1
2018.01.04;2.75;comment 2
2018.01.07;5.25;comment 4
2018.01.09;1.25;comment 7

Я хочу заменить все точки .во втором столбце запятой, ,как если бы я указывал, sed 's/\./\,/g' fileкак использовать sedили предпочтительно awkприменять это только для второго столбца, поэтому мой вывод будет выглядеть следующим образом:

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7

Ответы:


22
$ awk 'BEGIN{FS=OFS=";"} {gsub(/\./, ",", $2)} 1' ip.txt
2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
  • BEGIN{} этот блок кода будет выполнен перед обработкой любой строки ввода
  • FS=OFS=";" установить разделитель поля ввода и вывода как ;
  • gsub(/\./, ",", $2)для каждой строки ввода замените все .поля во втором поле на,
  • 1это идиома awk для печати содержимого $0(которое содержит входную запись)

1
офигенно, много THX!
натй

9
sed 's/\./,/3' file

заменить третье вхождение точки


2
Другое использование Useles cat... Почему бы не просто sed 's/\./,/3' file? (Кроме того, запятую не нужно экранировать.)
twalberg

Я учел наблюдения
Эмилио Галаррага

catне обязательно будет бесполезным здесь. Это позволило бы операции использовать 2 ядра.
Рон Ротман

@ronrothman, какова будет цель работы ядра cat, кроме использования ресурсов? Может быть , чтобы обеспечить немного буфера, но это намерение должно быть лучше выражены с помощью инструмента , как bufferчем cat.
Роланд Иллиг

Чтобы отделить (блокирующий) чтение диска от замены строки. Да, я полагаю, вы можете думать об этом как о буферизации.
рон Ротман

4

Сделано по методу ниже, используя awk

Команда: awk -F ";" '{gsub(/\./,",",$2);print $1";"$2";"$3}' filename

вывод

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.