Разбор первого столбца файла CSV в новый файл

Операционная система: OSX Метод: из командной строки, используя sed, cut, gawk, хотя желательно без установки модулей.

По сути, я пытаюсь взять первый столбец файла csv и преобразовать его в новый файл.

Пример входного файла

EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6

Желание вывода

EXAMPLEfoo 
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

Итак, я хочу первую колонку.

Вот что я пробовал до сих пор:

awk -F"," '{print $1}' in.csv > out.txt

awk -F"," '{for (i=2;i<=NF;i++)}' in.csv > out.txt

awk -F"," 'BEGIN { OFS="," }' '{print $1}' in.csv > out.txt

cat in.csv | cut -d \, -f 1 > out.txt

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


person S1syphus    schedule 16.04.2010    source источник
comment
Как я указал в ответ на ваш предыдущий (и очень похожий) вопрос, мой код моего проекта FOSS. google.com/p/csvfix делает именно это, его проще использовать для синтаксического анализа CSV, чем awk и др., и он работает на OSX.   -  person    schedule 16.04.2010


Ответы (4)


У меня отлично работает ваш последний вариант:

$ cat > in.csv  # Then pasted the example input followed by Ctrl+D:
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
[Ctrl+D]
$ cat in.csv | cut -d, -f1
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

Может быть, окончания строк вас здесь кусают? Если файл имеет окончания строки в стиле DOS или даже в стиле старого Mac, это может вызвать странное поведение. Попробуйте запустить file in.csv и посмотрите, что из этого получится.

$ file in.unix.csv
in.unix.csv: ASCII text
$ file in.dos.csv
in.dos.csv: ASCII text, with CRLF line terminators

В последнем случае используйте инструмент dos2unix для преобразования файла.

Изменить: в OS X кажется, что flip - это то, что вы хотите < / а>.

person Thomas    schedule 16.04.2010
comment
Вы были в курсе концовок строк, исправили это сейчас. - person S1syphus; 16.04.2010

Я скопировал ваш образец ввода, сохранил его как in.csv, а затем запустил вашу первую строку,

awk -F"," '{print $1}' in.csv > out.txt

и он работал отлично, вот так:

$ emacs in.csv
$ cat in.csv 
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
$ awk -F"," '{print $1}' in.csv > out.txt
$ cat out.txt 
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3

Это в Terminal.app в OS X 10.5.

person Personman    schedule 16.04.2010
comment
Это странно, в последнее время у меня возникают проблемы с awk. - person S1syphus; 16.04.2010

На мой взгляд, сокращение дает ожидаемый результат:

cut -d, -f1 < in.csv > out.txt
person Michal Čihař    schedule 16.04.2010

Если Perl - вариант:

perl -F, -lane 'print $F[0]' in.csv > out.txt

Используются следующие параметры командной строки:

  • -n цикл вокруг каждой строки входного файла
  • -l удаляет символы новой строки перед обработкой и добавляет их после
  • -a режим автоматического разделения - разделение входных строк на массив @F. По умолчанию разделение выполняется по пробелам.
  • -e выполнить код Perl
  • -F модификатор autosplit, в данном случае разбивается на ,

@F - это массив слов в каждой строке, индексированных, начиная с $F[0]

person Chris Koknat    schedule 13.11.2015