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

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

$307.00
$132.34
$30.23
12 голосов | спросил Dudusmaximus 4 SatEurope/Moscow2010-12-04T04:36:11+03:00Europe/Moscow12bEurope/MoscowSat, 04 Dec 2010 04:36:11 +0300 2010, 04:36:11

4 ответа


0

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

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

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

ответил SiegeX 4 SatEurope/Moscow2010-12-04T08:16:06+03:00Europe/Moscow12bEurope/MoscowSat, 04 Dec 2010 08:16:06 +0300 2010, 08:16:06
0

Я думаю, что вы говорите, что хотите разделить входные данные на поля 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
ответил Kamal 4 SatEurope/Moscow2010-12-04T06:14:54+03:00Europe/Moscow12bEurope/MoscowSat, 04 Dec 2010 06:14:54 +0300 2010, 06:14:54
0

Чтобы позволить 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

ответил D Bro 5 Mayam13 2013, 01:14:26
0

Файл данных:

$ 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
ответил JUST MY correct OPINION 4 SatEurope/Moscow2010-12-04T06:26:42+03:00Europe/Moscow12bEurope/MoscowSat, 04 Dec 2010 06:26:42 +0300 2010, 06:26:42

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132