awk может иметь дело с файлом CSV, который содержит запятую в заключенном в кавычки поле?

Я использую awk для выполнения подсчета суммы одного столбца в файле CSV. Формат данных - что-то как:

id, name, value
1, foo, 17
2, bar, 76
3, "I am the, question", 99

Я использовал этот awk сценарий для подсчета суммы:

awk -F, '{sum+=$3} END {print sum}'

Часть значения в поле имени содержит запятую и это повреждение мой awk сценарий. Мой вопрос: awk может решить эту проблему? Если да, и как я могу сделать это?

Спасибо.

24
задан smci 24 July 2014 в 01:22
поделиться

4 ответа

вы пишете функцию в awk, как показано ниже:

$ awk 'func isnum(x){return(x==x+0)}BEGIN{print isnum("hello"),isnum("-42")}'
0 1

вы можете включить в ваш скрипт эту функцию и проверить, является ли третье поле числовым или нет. если нет, то переходите к 4-му полю, и если 4-е поле, в свою очередь, не числовое, переходите к 5-му ... пока не достигнете числового значения. возможно, здесь поможет цикл, и добавьте его к сумме.

-4
ответ дан 28 November 2019 в 23:47
поделиться

Вы всегда можете решить проблему из источника. Поместите поле имени в кавычки, как в поле «Я - вопрос». Это намного проще, чем тратить время на кодирование обходных путей.

Обновление (по просьбе Денниса). Простой пример

$ s='id, "name1,name2", value 1, foo, 17 2, bar, 76 3, "I am the, question", 99'

$ echo $s|awk -F'"' '{ for(i=1;i<=NF;i+=2) print $i}'
id,
, value 1, foo, 17 2, bar, 76 3,
, 99

$ echo $s|awk -F'"' '{ for(i=2;i<=NF;i+=2) print $i}'
name1,name2
I am the, question

Как вы можете видеть, установив в качестве разделителя двойные кавычки, поля, принадлежащие «кавычкам», всегда будут иметь четное число. Поскольку OP не может изменять исходные данные, этот метод ему не подходит.

2
ответ дан 28 November 2019 в 23:47
поделиться

Вам, вероятно, лучше сделать это на perl с помощью Text :: CSV, поскольку это быстрое и надежное решение.

4
ответ дан 28 November 2019 в 23:47
поделиться

Если вы точно знаете, что колонка 'value' всегда последняя:

awk -F, '{sum+=$NF} END {print sum}'

NF представляет количество полей, поэтому $NF - последняя колонка

2
ответ дан 28 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: