일부 파일을 읽고 출력을 정렬하고 싶습니다.
예를 들어:
cat example.conf
Order: 0
Package: example
cat another.conf
Order: 2
Package: another
cat file.conf
Order: 1
Package: file
다음과 같은 방법으로 출력합니다 awk '/Order|Package/' conf/*.conf
.
Order: 2
Package: another
Order: 0
Package: example
Order: 1
Package: file
Order:
출력을 다음 숫자로 정렬하되 행 간의 관계를 끊지 않기를 원합니다 . 예를 들면 다음과 같습니다.
Order: 0
Package: example
Order: 1
Package: file
Order: 2
Package: another
답변1
awk
GNU > 4.0을 사용 하고 해당 Order
레코드가 항상 Package
이 레코드 앞에 있다고 가정하면
gawk '/^Order/ {order = $2} /^Package/ {p[order] = $0}
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (i in p) {print "Order:", i; print p[i]}
}
' conf/*.conf
Order: 0
Package: example
Order: 1
Package: file
Order: 2
Package: another
노인의 경우 다음을 gawk
사용할 수 있습니다 asorti
.
gawk '/^Order/ {order = $2} /^Package/ {p[order] = $0}
END {
n = asorti(p,b)
for (i=1;i<=n;i++) {print "Order:", i; print p[b[i]]}
}
' conf/*.conf
답변2
두 줄만 포함하는 파일에 대해 작동합니다.
sed -n 'N; s/\n//p' *.conf | sort | sed -n 's/\(Package\)/\n\1/p'
설명하다:
sed -n 'N; s/\n//p' *.conf
- 두 줄 사이의 개행 문자를 제거합니다. 즉, 연속된 두 줄을 한 줄로 합칩니다.sort
- 이전 단계에서 생성된 긴 행을 정렬합니다.sed -n 's/\(Package\)/\n\1/p'
- 개행 문자를 원래 위치로 되돌립니다.
산출:
Order: 0
Package: example
Order: 1
Package: file
Order: 2
Package: another
답변3
간단한 유닉스 방법:
awk '/Order|Package/' conf/*.conf | # get your usual output
paste - - | # convert two lines to one
sort -n -k2,2 | # sort numerically
awk '{print $1,$2;print $3,$4}' # re-print in two columns
답변4
이것은 또한 작동합니다:
grep -e ^Order -e ^Package `grep ^Order *.conf | awk -F: '{printf("%s:%s\n",$NF,$0);}' |sort| awk -F: '{print $2}'`
설명(아래 여러 줄 형식은 데모용으로만 사용됩니다.아니요결과 단일 행 명령을 처리할 수 없으므로 bash에서 작동합니다.논평):
$ grep -e ^Order -e ^Package ` \ # grep for lines starting with "Order" or "Package"; start nested command
> grep ^Order *.conf | \ # grep for lines starting with "Order" in files *.conf
> awk -F: '{printf("%s:%s\n",$NF,$0);}' | \ # prefixing order number with a separating colon
> sort | \ # sort by order number
> awk -F: '{print $2}' \ # extract file name alone ; now filenames are ordered by the order number contained within them
> ` # end nested command