Как манипулировать выходом awk? - PullRequest
5 голосов
/ 13 февраля 2012

Если я наберу

echo '"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097,73";' | awk -F';' '{print $3 " " $7}'

, я получу

" 01.06.2011" "-6.097,73"

, но мне хотелось бы получить

" 01.06.2011" "-6097"

Как это сделать?

Ответы [ 5 ]

3 голосов
/ 13 февраля 2012

AWK поддерживает функцию printf и из памяти анализирует как можно большую часть строки как целое число. Итак, из вашего примера:

awk -F';' '{printf("%s %i", $3, $7*1000);}'

будет работать. Это будет работать для любого числа размера, тоже ...

(выше не работает из-за двойных кавычек в данных, см. Ниже ...)

РЕДАКТИРОВАТЬ: Если вы используете gawk, вы можете добиться этого стабильно, используя комбинацию printf и strtonum .

awk -F';' '{ gsub(/"/, "", $7); printf("%s \"%i\"\n", $3, strtonum($7)*1000); }'

Вызов gsub() удаляет кавычки, чтобы strtonum не давил их, а затем вызов printf возвращает их обратно как часть строки формата ...

2 голосов
/ 13 февраля 2012

Вы можете добавить запятую и двойную кавычку в качестве разделителей полей и разместить соответственно

awk -F'[";,]' '{print "\""$8 " \""$21*1000"\""}'

Выход

$ awk -F'[";,]' '{print "\""$8 " \""$21*1000"\""}' <<<'"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097>
" 01.06.2011 "-6097"
2 голосов
/ 13 февраля 2012

Вы можете попробовать использовать функцию gsub:

echo '"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097,73";' | awk -F';' '{gsub(/(,.*|\.)/,"",$7);print $3" "$7"\"";}'

Может соответствовать нескольким критериям.Это может быть самое короткое решение.

2 голосов
/ 13 февраля 2012

Это будет работать. Использует split () .

echo '"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097,73";' | awk -F';' '{ split($7, a, ",") split(a[1], b, "."); print $3 " " b[1] b[2]"\""}'

или комбинация split() и sub().

awk -F';' '{ split($7, a, ",");b = a[1]; sub(/\./, "",a[1]);  print $3 " " a[1] "\""}'

или просто с помощью sub()

awk -F';' '{ sub(/,.*/, "", $7); sub(/\./, "", $7) ;print $3 " " $7 "\""}'

Соответствующий документ:

split (строка, массив, fieldsep)

Это делит строку на части отделяется fieldsep, и хранит части в массиве. Первый кусок хранится в массиве [1], второй кусок в массиве [2] и т. д. строковое значение третьего аргумента, fieldsep, является регулярным выражением, описывающим где разделить строку (так же, как FS может быть регулярным выражением, описывающим, где разделить входные записи). Если fieldsep опущен, значение FS равно используемый. split возвращает количество созданных элементов. Раскол Затем функция разбивает строки на части, аналогично пути ввода строк разбиты на поля. Например:

split ("auto-da-fe", a, "-") разбивает строку auto-da-fe' into three fields using - 'в качестве разделителя.

Устанавливает содержимое массива a следующим образом: a [1] = "auto" a [2] = "da" a [3] = "fe"

1 голос
/ 13 февраля 2012

Просто манипулируйте $7, чтобы удалить ненужные символы:

awk -F';' '{
  gsub(/[.]/, "", $7)
  sub(/,[0-9]*/, "", $7)
  print $3, $7
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...