Парсинг данных с помощью awk

Я делаю скрипт для bash, но мне нужно помочь с одной частью скрипта. У меня есть значения в этом формате

1,12, 3,70, 2,29
1,12, 3,78, 2,79
1,12, 3,27, 2,25

и мне нужно преобразовать в этот формат

1.12 3.70 2.29
...
...

Поэтому мне нужно изменить запятую на точку и удалить запятую после числа. Я хотел бы сделать это с помощью awk, но я понятия не имею, как это сделать. Я могу разобрать его на 3 разных файла, а затем разбить на один командой paste , но хотелось бы сделать это более эффективно. Спасибо.


person user3499733    schedule 01.05.2014    source источник


Ответы (6)


Использование СЭД:

sed 's/,\([0-9]\)/.\1/g;s/,//g;' file
1.12 3.70 2.29
1.12 3.78 2.79
1.12 3.27 2.25

В основном это двухфазный подход, при котором 1-я операция заменяет запятые, за которыми следует цифра с точкой, а 2-я операция просто удаляет оставшиеся запятые.

person anubhava    schedule 01.05.2014
comment
На самом деле я понял из вашего ответа. +1 за это. - person Avinash Raj; 01.05.2014

Вот один из них с использованием awk:

$ awk -F', ' '{$1=$1;gsub(/,/,".")}1' file
1.12 3.70 2.29
1.12 3.78 2.79
1.12 3.27 2.25
  • Установите разделитель полей на запятую и пробел.
  • Перестройте всю строку, чтобы разрешить разделение полей по умолчанию OFS (пробел).
  • Используя gsub, замените , на .
person jaypal singh    schedule 01.05.2014

Эта команда sed также будет работать,

sed 's/, / /g;s/,/./g' file
  • s/, / /g - заменяет запятую и пробел только пробелом.

  • s/,/./g — из вывода вышеуказанной команды он заменяет , на .

Пример:

$ echo "1,12, 3,70, 2,29" | sed 's/, / /g;s/,/./g'
1.12 3.70 2.29
person Avinash Raj    schedule 01.05.2014
comment
Не нужно избегать пробелов. - person Kevin; 01.05.2014

и это тоже работает. с опцией -e вы можете добавить команды sed в тот же экземпляр:

sed -e s/", "/" "/g -e s/","/./g file1
person Juan Aguilera    schedule 01.05.2014

awk решение.

awk '{sub(/, /," ");gsub(/,/,".")}1' file
1.12 3.70. 2.29
1.12 3.78. 2.79
1.12 3.27. 2.25
person Jotne    schedule 01.05.2014

person    schedule
comment
Вероятно, можно уменьшить до perl -lpe '$_=~s/(\d+),(\d+),*/$1.$2/g' file - person jaypal singh; 01.05.2014
comment
@JS웃 Спасибо за комментарий! Я согласен. - person Håkon Hægland; 01.05.2014