[unix] UNIX 정렬에서 헤더 행을 무시하는 방법이 있습니까?

UNIX (제 경우에는 Cygwin) 정렬 유틸리티를 사용하여 정렬하려는 고정 너비 필드 파일이 있습니다.

문제는 파일 맨 위에 두 줄 헤더가 있고 파일 맨 아래로 정렬된다는 것입니다 (각 헤더 행이 콜론으로 시작됨).

정렬을 “정렬되지 않은 상태에서 처음 두 줄을 전달”하거나 콜론 줄을 맨 위로 정렬하는 순서를 지정하는 방법이 있습니까? 나머지 줄은 항상 6 자리 숫자로 시작합니다 (실제로는 I 그게 도움이된다면 정렬 중입니다.

예:

:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00

다음과 같이 정렬해야합니다.

:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00



답변

(head -n 2 <file> && tail -n +3 <file> | sort) > newfile

괄호는 단일 명령에서 나온 것처럼 파이프하거나 리디렉션 할 수 있도록 stdout을 감싸는 서브 쉘을 만듭니다.


답변

을 사용해도 괜찮다면 의 내장 파이프 기능 awk을 활용할 수 있습니다.awk

예.

extract_data | awk 'NR<3{print $0;next}{print $0| "sort -r"}'

이렇게하면 처음 두 줄이 그대로 인쇄되고 나머지 줄은 sort.

이것은 파이프 된 입력의 일부를 선택적으로 정렬 할 수 있다는 매우 특별한 이점이 있습니다. 제안 된 다른 모든 방법은 여러 번 읽을 수있는 일반 파일 만 정렬합니다. 이것은 무엇이든 작동합니다.


답변

다음은 파이프 된 데이터에서 작동하는 버전입니다.

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

헤더에 여러 줄이있는 경우 :

(for i in $(seq $HEADER_ROWS); do read -r; printf "%s\n" "$REPLY"; done; sort)

이 솔루션은 여기에서


답변

간단한 경우 sed에는 작업을 우아하게 수행 할 수 있습니다.

    your_script | (sed -u 1q; sort)

또는 동등하게

    cat your_data | (sed -u 1q; sort)

키는 1q-print first line (header) 및 종료 (나머지 입력은 sort)에 있습니다.

주어진 예 2q에서 트릭을 수행합니다.

-u스위치 (버퍼링)이 그 필요 sed당신이 통과하도록 (특히, GNU의) 그렇지 않으면 덩어리에서 입력을 읽을 것입니다하여 데이터를 소모의 sort대신.


답변

사용할 수 있습니다 tail -n +3 <file> | sort ...(tail은 세 번째 줄에서 파일 내용을 출력합니다).


답변

head -2 <your_file> && nawk 'NR>2' <your_file> | sort

예:

> cat temp
10
8
1
2
3
4
5
> head -2 temp && nawk 'NR>2' temp | sort -r
10
8
5
4
3
2
1


답변

2 줄의 코드 만 있으면됩니다 …

head -1 test.txt > a.tmp;
tail -n+2 test.txt | sort -n >> a.tmp;

숫자 데이터의 경우 -n이 필요합니다. 알파 정렬의 경우 -n이 필요하지 않습니다.

예제 파일 :
$ cat test.txt

헤더
8
5
100
1
-1

결과 :
$ cat a.tmp

헤더
-1
1
5
8
100