2013-04-09 4 views
3

내가 예를 들어, 배관 다수의 리눅스 쉘 명령 광범위하게 사용하는 명령 관로. 예를 들어, 제 1 행을 변경하지 않고 grep, sed 및 sort를 2 행에서 정렬하고 싶습니다.일반 솔루션은

일부 명령 (들)이 헤더를 보존한다는 일부 일반적인 해결책을 찾고 있습니다. 필자는 일반적으로 파이프 앞에 파일 헤더를 쓴 다음 파이프가 끝난 후에 다시 헤더에 기록합니다. zshell을 사용하기 시작 했으므로 좀 더 간소화 된 솔루션을 얻는 데 도움이되는지 궁금합니다. 이 같은

아마 뭔가 :

enter image description here

(화살표 이미지의 파이프입니다)하지만 난 그 zshell에서 일을하거나 심지어는 가능하면하는 방법을 모르겠습니다. 하나의 문제는 두 파이프의 명령으로 첫 번째 파이프 분할을 수행해야한다는 것입니다.

모든 창의적인 솔루션은 무엇입니까?

+1

나는 abouth zsh를 모르지만 bash를 사용하면'(head -2 file1; tail -n +3 file1 | grep BLAH | sed/old/new/'| sort -k 1,1)> file3' –

+1

@Vaughn 두 줄의 머리글을 고려한 것 같습니다. 당신은 아마'(head -n +1 blah; tail -n +2 blah | sed/old/new '| sort -k 1,1)> outfile'을 의미 할 것입니다. – devnull

+0

@devnull : 당신 말이 맞아요. 필자는 두 개의 헤더 행을 사용하여 파일 작업을하는 데 익숙해졌습니다. –

답변

2

본과 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
  • 당신이 절대적으로 알고있는 경우가 tail -n +2 file1 부분을 건너 뛸 수 있습니다 head -n 2
  • 처럼 -n 매개 변수를 사용해야되지 않습니다 당신이 헤더에서 찾을 수 없습니다에 대한 grepping있다,하지만 확실히 청소기이 방법이 무엇인지.

이것은 최근의 쉘 btw (bash, ksh, zsh)에서 작동합니다.