여러 구분 기호로 파일을 정렬하는 방법은 무엇입니까?

여러 구분 기호로 파일을 정렬하는 방법은 무엇입니까?

openSUSE에서 사용 가능한 패치를 나열하면 다음과 같은 출력이 생성됩니다.

다음 세부정보를 생성하는 명령은 입니다 zypper patches. 명령을 실행할 때도 동일한 결과가 표시됩니다.zypper list-patches -a

Loading repository data...
Reading installed packages...
Repository                        | Name               | Category    | Severity  | Interactive | Status     | Summary                                                                                           
----------------------------------+--------------------+-------------+-----------+-------------+------------+---------------------------------------------------------------------------------------------------
openSUSE-Leap-15.0-Update         | openSUSE-2018-1000 | recommended | moderate  | ---         | not needed | Recommended update for gnuhealth, proteus, tryton, trytond, trytond_purchase, trytond_stock_supply
openSUSE-Leap-15.0-Update         | openSUSE-2018-1004 | security    | low       | ---         | not needed | Security update for ffmpeg-4                                                                      
openSUSE-Leap-15.0-Update         | openSUSE-2018-1005 | security    | moderate  | ---         | not needed | Security update for chromium                                                                      
openSUSE-Leap-15.0-Update         | openSUSE-2018-1006 | security    | moderate  | ---         | applied    | Security update for okular                                                                        
openSUSE-Leap-15.0-Update         | openSUSE-2018-1007 | recommended | moderate  | ---         | applied    | Recommended update for tigervnc     

예를 들어, 명령을 사용하여 "상태"를 정렬하려고 하면 sort -k 6,6 listing.txt | less다음과 같은 출력이 생성됩니다.

----------------------------------+--------------------+-------------+-----------+-------------+------------+---------------------------------------------------------------------------------------------------
Loading repository data...
Reading installed packages...
openSUSE-Leap-15.0-Update-Non-Oss | openSUSE-2018-1082 | recommended | moderate  | ---         | not needed | Security update for opera                                                                         
openSUSE-Leap-15.0-Update-Non-Oss | openSUSE-2018-1240 | recommended | moderate  | ---         | not needed | Recommended update for opera                                                                      
openSUSE-Leap-15.0-Update-Non-Oss | openSUSE-2018-1294 | recommended | low       | ---         | not needed | Recommended update for Regina-REXX, THE, ooRexx                                                   
openSUSE-Leap-15.0-Update         | openSUSE-2018-1000 | recommended | moderate  | ---         | not needed | Recommended update for gnuhealth, proteus, tryton, trytond, trytond_purchase, trytond_stock_supply
openSUSE-Leap-15.0-Update         | openSUSE-2018-1007 | recommended | moderate  | ---         | applied    | Recommended update for tigervnc    
Repository                        | Name               | Category    | Severity  | Interactive | Status     | Summary                   

구분 기호가 공백과 탭의 조합인지 확인하기 위해 vim에서 구문 강조 규칙을 사용할 때 공백만 반환합니다.

:syntax on
:set syntax=whitespace 

여기에 이미지 설명을 입력하세요.

파일이 여러 구분 기호를 사용하는 것 같습니다.

  • 사용할 구분 기호를 결정하는 가장 효율적인 방법은 무엇입니까?
  • 사용된 구분 기호를 기준으로 열을 정렬하는 가장 좋고 쉬운 방법은 무엇입니까?

답변1

헤더를 그대로 유지하려는 경우가 아니면 이 방법이 작동합니다.

tail -n +5 listing.txt | sort -b -k6 -t'|'

파일에서 공백을 자주 사용하는 경우(즉, 합계를 혼합하지 않는 경우) ("앞 공백 무시") -b옵션을 생략할 수 있습니다.sort| applied| applied

그러나 나는 a) 프로그램에 기계가 읽을 수 있는 형식으로 형식을 지정하는 몇 가지 옵션이 있을 수 있고 b) 예를 들어 사용하는 것이 더 나을 것이라고 생각합니다. awk -F'|' '$6~/not needed/'바꾸다 sort.

답변2

다음을 사용할 수 있습니다.

awk 'NR<=4 {print $0; next } { print $0 | "sort -k6,6 -t\\|" }' listing.txt

awk; 대신 에 listing.txt데이터를 파이프합니다 ( awk물론 listing.txt끝은 생략). -script는 awk처음 4개의 헤더 행을 있는 그대로 인쇄합니다. 나머지 행은 으로 파이프됩니다 sort. Sort열 6을 정렬하고 파이프 기호와 동일한 구분 기호로 식별합니다.

관련 정보