2009-07-22 6 views
0

필자는 표준 명령 행 도구 인 bash, awk, sort 등을 사용하여 이것을 정렬하는 방법을 찾으려고했지만 펄을 사용하는 것과는 다른 방식을 찾을 수는 없습니다.명령 줄 도구를 사용하여 서브 그룹 줄 정렬

힌트가 있습니까?

입력 데이터

header1 
3 
2 
5 
1 

header2 
5 
1 
3 
..... 
..... 

출력 데이터

header1 
1 
2 
3 
5 

header2 
1 
.... 

감사

답변

2

섹션을 가정 빈 줄로 구분되며 머리글에는 반드시 "머리글"이라는 문자열이 들어 있지 않습니다. 정렬 순서가 안정되도록 섹션을 원래 순서대로 둡니다. stdin에서 읽으며 stdout에 표시합니다.

#!/bin/bash 

function read_section() { 
    while read LINE && [ "$LINE" ]; do echo "$LINE"; done 
} 

function sort_section() { 
    read HEADER && (echo "$HEADER"; sort; echo) 
} 

while read_section | sort_section; do :; done 

또는 한 - 라이너

:

cat test.txt | while (while read LINE && [ "$LINE" ]; do echo "$LINE"; done) | (read HEADER && (echo "$HEADER"; sort; echo)); do :; done 
+0

정말 멋집니다! – Mark

+0

"cat"은 생략 할 수 있습니다. # while ...... 할 :; done ghostdog74

+0

젠장, 나는 누군가가 나에게 "Cat Award의 쓸모없는 사용법"을 던져 줄 것을 알았다. –

0

사용 AWK는 각 번호 라인에 header를 접두사합니다.
sort 결과 파일.
접두사를 제거하여 파일을 원래 형식으로 되돌립니다.

+0

흠, 당신은 정교한 수 있습니까? 헤더가 반드시 순서대로 정렬되는 것은 아니며 정렬은 안정적이어야합니다. –

+0

@Arkaitz, 'Mark'는 내가 말한 것을 보여주었습니다. 그 일을하기 위해 그에게 +1 (그리고 어쩌면 -1 당신에게 시도하지?, 오케이, 나는 농담이다). – nik

1

이 시도 :

[email protected]:~$ cat /tmp/test.txt 
header1 
3 
2 
5 
1 

header2 
5 
1 
3 
[email protected]:~$ cat /tmp/test.txt | awk '/header/ {colname=$1; next} {print colname, "," , $0}' | sort | awk '{if ($1 != header) {header = $1; print header} print $3}' 
header1 

1 
2 
3 
5 
header2 
1 
3 
5 

은 빈 줄 제거하기 위하여는, 나는 당신이 추가 할 수있는 것 같아요 "| 그렙 -v '^ $'"말을 ...

0

GNU의 AWK와 함께, 당신은 내부 정렬 기능을 사용할 수 있습니다.

awk 'BEGIN{ RS=""} 
{ 
    print $1 
    for(i=2;i<=NF;i++){ 
     a[i]=$i 
    } 
    b=asort(a,d) 
    for(i=1;i<=b;i++){  
     print d[i] 
    } 
    delete d 
    delete a  
} ' file 

출력

# more file 
header1 
3 
2 
5 
1 

header2 
5 
1 
3 
# ./test.sh 
header1 
1 
2 
3 
5 
header2 
1 
3 
5