Проанализировать файл csv, содержащий запятые в полях с awk

Мне нужно использовать awk для печати 4 разных столбцов в файле csv. Проблема в том, что строки находятся в формате $x, xxx.xx. Когда я запускаю обычную команду awk.

awk -F, {print $1} testfile.csv

мой вывод `заканчивается похожим на

307.00
$132.34
30.23

Что я делаю неправильно.

"$141,818.88","$52,831,578.53","$52,788,069.53"  это примерно вход. Файл, который я должен проанализировать, составляет 90 000 строк и около 40 столбцов Вот как складывается вклад или, по крайней мере, его части, с которыми мне приходится иметь дело. Извините, если я заставил вас думать, что это не то, о чем я говорил.

Если ввод "$ 307,00", "$ 132,34", "$ 30,23", Я хочу, чтобы результат находился в

$307.00
$132.34
$30.23
4 ответа

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

awk -F'","|^"|"$' '{print $2}' testfile.csv

Ввод

# cat testfile.csv
"$141,818.88","$52,831,578.53","$52,788,069.53"
"$2,558.20","$482,619.11","$9,687,142.69"
"$786.48","$8,568,159.41","$159,180,818.00"

Выход

# awk -F'","|^"|"$' '{print $2}' testfile.csv
$141,818.88
$2,558.20
$786.48

Вы заметите, что поле "first" на самом деле $2 из-за разделителя полей ^". Небольшая цена за короткий 1-лайнер, если вы спросите меня.


Я думаю, что вы говорите, что хотите разбить входные данные на поля CSV, не запрыгая запятыми внутри двойных кавычек. Если так...

Сначала используйте "," в качестве разделителя полей, например:

awk -F'","' '{print $1}'

Но тогда вы все равно получите двойную кавычку в начале $1 (и в конце последнего поля). Обращайтесь с этим путем удаления цитат с помощью gsub, например:

awk -F'","' '{x=$1; gsub("\"","",x); print x}'

Результат:

echo '"abc,def","ghi,xyz"' | awk -F'","' '{x=$1; gsub("\"","",x); print x}'
abc,def


Чтобы позволить котируемым символам awk содержать разделитель полей, вы можете использовать небольшой script, который я написал, называемый csvquote. Он временно заменяет запятые запятыми непечатаемыми символами, а затем восстанавливает их в конце вашего конвейера. Вот так:

csvquote testfile.csv | awk -F, {print $1} | csvquote -u

Это также будет работать с любой другой программой обработки текста UNIX, например cut:

csvquote testfile.csv | cut -d, -f1 | csvquote -u

Здесь вы можете получить код csvquote: https://github.com/dbro/csvquote


Файл данных:

$ cat data.txt
"$307.00","$132.34","$30.23"

AWK script:

$ cat csv.awk
BEGIN { RS = "," }
{ gsub("\"", "", $1);
 print $1 }

Выполнение:

$ awk -f csv.awk data.txt
$307.00
$132.34
$30.23

licensed under cc by-sa 3.0 with attribution.