Фильтрация строк по значениям столбцов CSV-файла - PullRequest
3 голосов
/ 29 сентября 2019

У меня есть набор данных с 1000 строк и 10 столбцов. Вот пример набора данных

A,B,C,D,E,F,
a,b,c,d,e,f,
g,h,i,j,k,l,
m,n,o,p,q,r,
s,t,u,v,w,x,

Из этого набора данных я хочу скопировать строки, значение столбца A которых равно «a» или «m», в новый файл CSV. Также я хочу, чтобы заголовок был скопирован.

Я пытался использовать awk. Он скопировал все строки, но не заголовок.

awk '{$1~/a//m/ print}' inputfile.csv > outputfile.csv

Как скопировать заголовок также в новый файл outputfile.csv?

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 29 сентября 2019

Это может сработать для вас (GNU sed):

sed '1b;/^[am],/!d' oldFile >newFile

Всегда печатайте первую строку и удаляйте любую другую строку, которая не содержит a, или m,.

Альтернатива:

awk 'NR==1 || /^[am],/' oldFile >newFile
2 голосов
/ 29 сентября 2019

Учитывая, что ваш заголовок будет в 1-й строке, пожалуйста, попробуйте выполнить следующее.

awk 'BEGIN{FS=OFS=","} FNR==1{print;next} $1 ~ /^a$|^m$/' Input_file > outputfile.csv

ИЛИ согласно комментарию Сира сэра, добавив следующее:

awk 'BEGIN{FS=OFS=","} FNR==1{print;next} $1 ~ /^(a|m)$/' Input_file > outputfile.csv

ИЛИ согласно Эд. Комментарий сэра, попробуйте следующее:

awk -F, 'NR==1 || $1~/^[am]$/' Input_file > outputfile.csv

Добавлены исправления в попытке ОП:

  1. Добавлено FS и OFS как, здесь для всех строк, так как строки разделяются запятыми.
  2. Добавлено условие FNR==1, которое означает, что здесь проверяется 1-я строка и просто печатается, поскольку мы хотим печатать заголовки в нашем файле. Он напечатает самую первую строку, а затем next пропустит все дальнейшие операторы отсюда.
  3. Использовал лучшее регулярное выражение для проверки условия 1-го поля $1 ~ /^a$|^m$/
1 голос
/ 30 сентября 2019
$ awk -F, 'BEGIN{split("a,m",tmp); for (i in tmp) tgts[tmp[i]]} NR==1 || $1 in tgts' file
A,B,C,D,E,F,
a,b,c,d,e,f,
m,n,o,p,q,r,
1 голос
/ 29 сентября 2019

с awk. Установите разделитель полей (FS) на , и выводите текущую строку, если это первая строка или если ее первый столбец содержит a или m.

awk 'NR==1 || $1=="a" || $1=="m"' FS=',' in.csv >out.csv

Вывод в out.csv:

A,B,C,D,E,F,
a,b,c,d,e,f,
m,n,o,p,q,r,
0 голосов
/ 29 сентября 2019

Похоже, что по умолчанию в awk используется разделитель пробелов. Ссылка

Изменение разделителя можно обозначить с помощью переменной FS:

awk 'BEGIN { FS = "," } ; { print $2 }'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...