разбирать CSV-файл, который содержит запятые в полях с awk - PullRequest
12 голосов
/ 04 декабря 2010

Я должен использовать 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" это примерно вход. Файл, который я должен проанализировать, состоит из 90000 строк и около 40 столбцов. Вот как выкладывается ввод или, по крайней мере, те его части, с которыми мне приходится иметь дело. Извините, если я заставил вас думать, что это не то, о чем я говорил.

Если введено «307,00 $», «132,34 $», «30,23 $» Я хочу, чтобы вывод был в

$307.00
$132.34
$30.23

Ответы [ 4 ]

16 голосов
/ 04 декабря 2010

Как ни странно, некоторое время назад мне пришлось решать эту проблему, и я держал код для этого.У вас это почти получилось, но вам нужно немного запутаться с разделителями полей.Вы заметите, что «первое» поле на самом деле $2 из-за разделителя полей ^".Маленькая цена, чтобы заплатить за короткий 1-лайнер, если вы спросите меня.

6 голосов
/ 04 декабря 2010

Я думаю, что вы говорите, что хотите разделить входные данные на поля 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
2 голосов
/ 05 мая 2013

Чтобы позволить awk обрабатывать поля в кавычках, которые содержат разделитель полей, вы можете использовать небольшой скрипт, который я написал, под названием 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

1 голос
/ 04 декабря 2010

Файл данных:

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

Скрипт AWK:

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

Выполнение:

$ awk -f csv.awk data.txt
$307.00
$132.34
$30.23
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...