정렬하되 헤더 행을 맨 위에 유지

정렬하되 헤더 행을 맨 위에 유지

먼저 열 헤더 묶음인 행을 생성한 다음 데이터 행 묶음을 생성하는 프로그램에서 출력을 얻고 있습니다. 이 출력의 개별 열을 잘라내어 개별 열을 기준으로 정렬된 것을 확인하고 싶습니다. 머리글이 없으면 열의 하위 집합 을 -k선택 하거나 확인하여 잘라내기와 정렬을 쉽게 수행할 수 있습니다 . 그러나 이 정렬 방법은 열 머리글을 나머지 출력 행과 혼합합니다. 제목을 상단에 유지하는 쉬운 방법이 있습니까?sortcutawk

답변1

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

답변2

bash를 사용하여 다음과 같이 제목을 맨 위에 유지할 수 있습니다.

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

아니면 Perl로 하세요:

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

답변3

내가 찾은awk의 좋은 버전스크립트에서 훌륭하게 작동합니다.

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

답변4

명령은 pee다음에서 비롯됩니다.더 많은 유틸리티이러한 유형의 작업을 위해 특별히 설계되었습니다.

예:

머리글 행을 유지하고 두 번째(숫자) 열을 정렬하려면 다음을 수행합니다 stdin.

<your command> | pee 'head -n 1' 'tail -n +2 | sort -k 2,2 -n'

설명하다:

pee: stdin을 하나 이상의 명령에 파이프하고 결과를 연결합니다.

head -n 1:표준 입력의 첫 번째 줄을 인쇄합니다.

tail -n +2:표준 입력에서 두 번째 및 다음 줄을 인쇄합니다.

sort -k 2,2 -n: 두 번째 열의 숫자를 기준으로 정렬합니다.

시험:

printf "header\na 1\nc 3\nb 2\n" | pee 'head -n 1' 'tail -n +2 | sort -k 2,2 -n'

주어진

header
a 1
b 2
c 3

관련 정보