2013-04-09 2 views
3

Я широко использовать несколько команд Linux оболочки трубопроводов, например:Общее решение для обхода заголовков файлов в оболочке команды

grep BLAH file1 | sed 's/old/new/' | sort -k 1,1 > file3 

Мои файлы часто имеют строку заголовка, и часто я должен сохранить его на протяжении всего трубопровод. Так, например, я хотел бы grep, sed и sort из строки 2 и дальше, сохраняя 1-ю строку без изменений.

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

Возможно, что-то вроде этого:

enter image description here

(стрелки трубы в изображении)

, но я не уверен, как получить, чтобы работать в zshell или, если это вообще возможно. Одна из проблем заключается в том, что мне нужно следить за первым разделом трубы с помощью команды на обеих трубах.

Любые творческие решения?

+1

Я не уверен, что abouth zsh, но с bash вы можете использовать '(head -2 file1; tail -n +3 file1 | grep BLAH | sed 's/old/new /' | sort -k 1,1)> file3' –

+1

@Vaughn Кажется, что вы учли в двух строках заголовка. Вероятно, вы имели в виду '(head -n +1 blah; tail -n +2 blah | sed 's/old/new' | sort -k 1,1)> outfile' – devnull

+0

@devnull: Вы правы. Я привык работать с файлами с двумя строками заголовка и просто использовал это, не задумываясь. –

ответ

2

Vaughn и devnull уже направили вас к решению. Оба они содержат опечатки, хотя и у меня есть несколько замечаний, чтобы добавить и советовал бы использовать вместо этого:

{ head -n 1 file1; tail -n +2 file1 | grep BLAH | sed 's/old/new/' | sort -k 1,1; } >file3 

Что она делает это взять первую строку file1 в одной команде (ваш заголовок) и делает вашу grep/sed/whatever магии вторая команда для остальной части файла (без заголовка, tail -n +2) и перенаправляет в сочетании на file3.

Примечание:

  • Если ваша оболочка поддерживает { } является предпочтительным по () конструкциям в этом случае не плодить подоболочку (иногда желательно иметь подоболочку, хотя).
  • head -2 устарела, вы должны использовать параметр -n как head -n 2
  • Вы можете пропустить tail -n +2 file1 часть, если вы абсолютно уверены, что то, что вы оглавлению для не могут быть найдены в вашем заголовке, но это, конечно, чище этот путь.

Это должно работать в самых последних оболочках, кстати, (bash, ksh, zsh).

 Смежные вопросы

  • Нет связанных вопросов^_^