как заставить grep игнорировать первую строку и обрабатывать другую строку - PullRequest
0 голосов
/ 21 апреля 2019

Мне нужно удалить строку, начинающуюся с '#' в некотором текстовом файле. но игнорируя первую строку в качестве заголовка. как заставить grep игнорировать первые строки и удалить любую строку, начинающуюся с #, для остальных строк?

cat sample.txt
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,xyz

cat sample.txt | grep -v "^\s*[#\;]\|^\s*$" > "out.txt"

но заголовок тоже удаляется!

Ответы [ 5 ]

3 голосов
/ 21 апреля 2019

С седом:

sed '2,${/^#/d}' sample.txt

От второй строки (2) до последней строки ($): найдите (/.../) строки, начинающиеся (^) с #, и удалите (d) их. Действие sed по умолчанию - печать текущей строки.

Выход:

#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz
2 голосов
/ 22 апреля 2019

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

sed '1b;/^#/d' file

Игнорировать первую строку и удалить любые другие строки, начинающиеся с #.

1 голос
/ 22 апреля 2019

Это приведет к тому, что любой awk будет печатать каждую строку, если ее номер строки равен 1 или он не начинается с #:

$ awk 'NR==1 || !/^#/' file
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz
1 голос
/ 21 апреля 2019

Попробуйте комбинацию head и grep примерно так:

head -1 sample.txt > out.txt && grep -v "^#" sample.txt >> out.txt

Результат

#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz

Альтернативный метод

grep "^#" sample.txt | head -1 > out.txt && grep -v "^#" sample.txt >> out.txt

То есть - строки grep начинаются с #, но просто выберите первую и запишите ее в файл.Затем выполните grep для всех строк, не начинающихся с #, и добавьте эти фиксированные значения в один и тот же выходной файл.

0 голосов
/ 21 апреля 2019

попробовал на GNU SED

sed '0,/^#/n;/^#/d' sample.txt
...