Я использую 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 может решить эту проблему? Если да, и как я могу сделать это?
Спасибо.
вы пишете функцию в awk, как показано ниже:
$ awk 'func isnum(x){return(x==x+0)}BEGIN{print isnum("hello"),isnum("-42")}'
0 1
вы можете включить в ваш скрипт эту функцию и проверить, является ли третье поле числовым или нет. если нет, то переходите к 4-му полю, и если 4-е поле, в свою очередь, не числовое, переходите к 5-му ... пока не достигнете числового значения. возможно, здесь поможет цикл, и добавьте его к сумме.
Вы всегда можете решить проблему из источника. Поместите поле имени в кавычки, как в поле «Я - вопрос». Это намного проще, чем тратить время на кодирование обходных путей.
Обновление (по просьбе Денниса). Простой пример
$ 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 не может изменять исходные данные, этот метод ему не подходит.
Вам, вероятно, лучше сделать это на perl с помощью Text :: CSV, поскольку это быстрое и надежное решение.
Если вы точно знаете, что колонка 'value' всегда последняя:
awk -F, '{sum+=$NF} END {print sum}'
NF представляет количество полей, поэтому $NF - последняя колонка