Поиск файла, показать совпадения и первую строку - PullRequest
4 голосов
/ 24 февраля 2012

У меня есть текстовый файл, разделенный запятыми, который содержит заголовки столбцов в первой строке:

column1;column2;colum3
foo;123;345
bar;345;23
baz;089;09

Теперь я хочу команду short , которая выводит первую строку исовпадающая строка (и).Есть ли более короткий путь, чем:

head -n 1 file ; cat file | grep bar

Ответы [ 6 ]

6 голосов
/ 24 февраля 2012

Это должно сделать работу:

sed -n '1p;2,${/bar/p}' file

где:

  • 1p напечатает первую строку
  • 2,$ будет соответствовать со второйстрока до последней строки
  • /bar/p выведет те строки, которые соответствуют bar

Обратите внимание, что строка заголовка не будет напечатана дважды, если в столбцах есть совпадениеимена.

3 голосов
/ 24 февраля 2012

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

cat file | awk 'NR<2;$0~v' v=baz
column1;column2;colum3
baz;089;09

Обычно cat file | ... бесполезно, но в этом случае он удерживает аргумент файла в стороне и позволяет быстро изменить переменную v.

Другое решение:

cat file | sed -n '1p;/foo/p' 
column1;column2;colum3
foo;123;345
3 голосов
/ 24 февраля 2012

Что если в первой строке тоже содержится bar?Тогда это напечатано два раза с вашей версией.awk решение:

awk 'NR == 1 { print } NR > 1 && $0 ~ "bar" { print }' FILE

Если вы хотите, чтобы строка поиска была почти последним элементом строки:

awk 'ARGIND > 1 { exit } NR == 1 { print } NR > 1 && $0 ~ ARGV[2] { print }' FILE YOURSEARCHSTRING 2>/dev/null

sed решение:

sed -n '1p;1d;/bar/p' FILE

Преимущество для них обоих в том, что это один процесс.

3 голосов
/ 24 февраля 2012

Вы можете использовать группирующие команды , а затем передать column команду для симпатичной печати

$ { head -1; grep bar; } <input.txt | column -ts';'
column1  column2  colum3
bar      345      23
2 голосов
/ 24 февраля 2012

head -n 1 file && grep bar file Возможно, есть даже более короткая версия, но она будет немного сложнее.

РЕДАКТИРОВАТЬ: согласно комментарию bobah, я добавил && между командами, чтобы была только одна ошибка для отсутствующего файла

1 голос
/ 24 февраля 2012

Вот самая короткая команда:

awk 'NR==1||/bar/' file
...