스크립트 출력을 정렬하되 줄을 함께 유지합니다.

스크립트 출력을 정렬하되 줄을 함께 유지합니다.

일부 파일을 읽고 출력을 정렬하고 싶습니다.

예를 들어:

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

awkGNU > 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'

설명하다:

  1. sed -n 'N; s/\n//p' *.conf- 두 줄 사이의 개행 문자를 제거합니다. 즉, 연속된 두 줄을 한 줄로 합칩니다.
  2. sort- 이전 단계에서 생성된 긴 행을 정렬합니다.
  3. 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

관련 정보