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