필자는 표준 명령 행 도구 인 bash, awk, sort 등을 사용하여 이것을 정렬하는 방법을 찾으려고했지만 펄을 사용하는 것과는 다른 방식을 찾을 수는 없습니다.명령 줄 도구를 사용하여 서브 그룹 줄 정렬
힌트가 있습니까?
입력 데이터
header1
3
2
5
1
header2
5
1
3
.....
.....
출력 데이터
header1
1
2
3
5
header2
1
....
감사
필자는 표준 명령 행 도구 인 bash, awk, sort 등을 사용하여 이것을 정렬하는 방법을 찾으려고했지만 펄을 사용하는 것과는 다른 방식을 찾을 수는 없습니다.명령 줄 도구를 사용하여 서브 그룹 줄 정렬
힌트가 있습니까?
입력 데이터
header1
3
2
5
1
header2
5
1
3
.....
.....
출력 데이터
header1
1
2
3
5
header2
1
....
감사
섹션을 가정 빈 줄로 구분되며 머리글에는 반드시 "머리글"이라는 문자열이 들어 있지 않습니다. 정렬 순서가 안정되도록 섹션을 원래 순서대로 둡니다. 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
사용 AWK는 각 번호 라인에 header
를 접두사합니다.
sort
결과 파일.
접두사를 제거하여 파일을 원래 형식으로 되돌립니다.
흠, 당신은 정교한 수 있습니까? 헤더가 반드시 순서대로 정렬되는 것은 아니며 정렬은 안정적이어야합니다. –
@Arkaitz, 'Mark'는 내가 말한 것을 보여주었습니다. 그 일을하기 위해 그에게 +1 (그리고 어쩌면 -1 당신에게 시도하지?, 오케이, 나는 농담이다). – nik
이 시도 :
[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 '^ $'"말을 ...
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
정말 멋집니다! – Mark
"cat"은 생략 할 수 있습니다. # while ...... 할 :; done
ghostdog74
젠장, 나는 누군가가 나에게 "Cat Award의 쓸모없는 사용법"을 던져 줄 것을 알았다. –