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