фильтрация CSV-файлов - PullRequest
       7

фильтрация CSV-файлов

3 голосов
/ 22 июня 2011

У меня есть CSV-файл со строкой заголовка, например,

headerA,headerB,headerC
bill,jones,p
mike,smith,f
sally,silly,p

Я бы хотел отфильтровать все записи со значением f в столбце headerC.

Могу ли я сделать это с помощью sed или awk?

Ответы [ 5 ]

8 голосов
/ 22 июня 2011

Если заголовок не содержит только f в имени третьего столбца:

sed '/,f$/d' FILE

сделает (удаляет каждую строку из ввода, если она заканчивается ,f).

Если бы это было так, я бы сказал:

sed -n -e '1p;/,[^f]$/p' FILE

(по умолчанию ничего не печатается (-n), но 1-я строка должна 1p, и если строки заканчиваются другим символом, отличным от f ... Примечание: это будет не работает, если 3-й столбец содержит более одного символа.)

И awk один:

awk -F, 'NF == 1 ; NF > 1 && $3 != "f"' FILE

(При этом всегда печатается первая строка (NF == 1 - истина, затем действие по умолчанию, равное print $0, затем следующие условия проверяют, прошли ли мы через 1-ю строку, а 3-е поле - не * 1024) * тогда действие по умолчанию ...)

НТН

2 голосов
/ 22 июня 2011

хорошо, если вы знаете, что headerC всегда находится в третьем столбце, будет работать следующая команда sed:

sed -r '/[^,]+(,[^,]+){1},f/ d' < file.csv > filefiltered.csv

И следующая команда awk делает то же самое:

awk 'BEGIN {FS=","} {if($3 != "f") print}' file.csv

Если вы не знаете, headerC всегда находится в определенной колонке, это становится немного сложнее. Это работает?

1 голос
/ 13 декабря 2012

grep работает, посмотрите на пример.

grep ",.*,.*f" << EOF
headerA,headerB,headerC
bill,josef,p
mike,smith,f
sally,silly,p
EOF

Выводы:

mike,smith,f
1 голос
/ 22 июня 2011

Немного неясно, это то, что вы просите?

$ awk -F, '{ if($3 == "f")print}' input
mike,smith,f

С заголовком и отформатирован с использованием column

$ awk -F, '{ if (NR == 1)print}{if($3 == "f")print}' input | column -t -s,
headerA  headerB  headerC
mike     smith    f
0 голосов
/ 22 июня 2011

нет необходимости в sed или awk, это можно сделать с помощью более простых команд, таких как cut и grep, передаваемых вместе, как это

cut -d"," -f 3| grep -i f

Я предполагаю, что разделитель - это кома, а столбец c - три.если это не изменить значения выше, соответственно.И я использовал grep с опцией i, чтобы игнорировать регистр.Если вы хотите сопоставить только нижний регистр f или верхний регистр f, удалите параметр i и измените его соответствующим образом.

...