정렬하지만 헤더 행을 맨 위에 유지 다음 한 줄의 데이터를 생성하는 프로그램에서

먼저 열 머리글 인 한 줄을 생성 한 다음 한 줄의 데이터를 생성하는 프로그램에서 출력을 얻습니다. 이 출력의 다양한 열을 잘라 내고 다양한 열에 따라 정렬하여보고 싶습니다. 헤더가 없으면 절단 및 정렬은 열의 하위 집합과 함께 또는 열의 -k옵션을 통해 쉽게 수행 할 수 있습니다. 그러나이 정렬 방법은 열 머리글을 나머지 출력 행과 혼합합니다. 헤더를 맨 위에 유지하는 쉬운 방법이 있습니까?sortcutawk



답변

Andy의 아이디어를 훔쳐서 사용하기 쉽도록하기

# print the header (the first line of input)
# and then run the specified command on the body (the rest of the input)
# use it in a pipeline, e.g. ps | body grep somepattern
body() {
    IFS= read -r header
    printf '%s\n' "$header"
    "$@"
}

이제 할 수 있습니다 :

$ ps -o pid,comm | body sort -k2
  PID COMMAND
24759 bash
31276 bash
31032 less
31177 less
31020 man
31167 man
...

$ ps -o pid,comm | body grep less
  PID COMMAND
31032 less
31177 less


답변

bash를 사용하여 헤더를 맨 위에 유지할 수 있습니다.

command | (read -r; printf "%s\n" "$REPLY"; sort)

아니면 펄로하세요 :

command | perl -e 'print scalar (<>); print sort { ... } <>'


답변

스크립트에서 잘 작동 하는 멋진 awk 버전 을 찾았 습니다 .

awk 'NR == 1; NR > 1 {print $0 | "sort -n"}'


답변

해 키지 만 효과적 임 : 정렬하기 전에 0모든 헤더 행과 1다른 모든 행 앞에 추가하십시오 . 정렬 후 첫 번째 문자를 제거하십시오.

… |
awk '{print (NR <= 2 ? "0 " : "1 ") $0}' |
sort -k 1 -k… |
cut -b 3-


답변

다음은 출력을 파이프하여 모든 것을 정렬하지만 첫 번째 줄은 맨 위에 두는 마술 펄 라인 노이즈입니다. perl -e 'print scalar <>, sort <>;'


답변

나는 command | {head -1; sort; }해결책을 시험해 보았고 실제로 나사를 조이는 것을 확인할 수 있었다head파이프에서 여러 줄을 읽은 다음 첫 번째 것을 출력한다. 따라서 읽지 head 않은sort 나머지 출력은 라인 2에서 시작하여 나머지 출력으로 전달 되지 않습니다 !

결과는 명령 출력의 시작 부분에있는 줄 (및 한 줄)이 누락 된 것입니다 (여전히 첫 번째 줄을 제외하고)- wc끝에 파이프를 추가하여 쉽게 확인할 수 있습니다. 위의 파이프 라인-이것을 모르면 추적하기가 매우 어렵습니다! 나는 출력을 풀기 전에 출력에 부분 라인 (처음 100 바이트 정도)이있는 이유를 해결하기 위해 적어도 20 분을 보냈습니다.

내가 아름답게 일했고 명령을 두 번 실행할 필요가없는 결과는 다음과 같습니다.

myfile=$(mktemp)
whatever command you want to run > $myfile

head -1 $myfile
sed 1d $myfile | sort

rm $myfile

출력을 파일에 넣어야하는 경우이를 다음과 같이 수정할 수 있습니다.

myfile=$(mktemp)
whatever command you want to run > $myfile

head -1 $myfile > outputfile
sed 1d $myfile | sort >> outputfile

rm $myfile


답변

나는 이것이 가장 쉽다고 생각한다.

ps -ef | ( head -n 1 ; sort )

또는 이것은 서브 쉘을 만들지 않기 때문에 아마도 더 빠릅니다.

ps -ef | { head -n 1 ; sort ; }

다른 멋진 용도

헤더 행 뒤의 셔플 라인

cat file.txt |  ( head -n 1 ; shuf )

헤더 행 뒤의 역행

cat file.txt |  ( head -n 1 ; tac )