여러 행과 열 정렬

여러 행과 열 정렬

본문에서:

35 EAST 23rd Street           SOUTH AFRICA   5    600   5000000   6 
83 NORTH YELLOWLIGHT AVENUE   SOUTH AFRICA   4    700   7000000   5 
777 NEW AVENUE                SAUDIA         2    900   5000000   3 
FIVE VISA ROAD                MEXICO         3    300    500000   7 
450 JACKSON BLVD              USA            3   1500    300000   4 
25 QUEENS ROAD SOUTH          SOUTH AFRICA   1    900    400000   3

gawk또는 를 사용하여 남아프리카만 두 번째 열로 오름차순으로 출력되도록 하려면 어떻게 해야 합니까 awk?sort

나는 시도했다:

awk -F. '/SOUTH AFRICA/ {print }' | sort -n -k5  

하지만 작동하지 않는 것 같습니다.

답변1

즉, 처음부터 일관성이 없어 나중에 명령을 실행하려고 할 때 문제를 일으키는 원래 입력을 먼저 수정해야 합니다.

이 문제를 해결하는 방법에 대한 자세한 내용은 다음과 같습니다.

게시된 콘텐츠를 확인하세요

먼저 문제를 살펴보겠습니다. 예를 들어 귀하가 게시한 내용을 복사하여 다음과 같이 저장하는 경우 original_file.tsv:

35 EAST 23rd Street     SOUTH AFRICA        5   600 5000000     6 
83 NORTH YELLOWLIGHT AVENUE SOUTH AFRICA    4   700 7000000     5 
777 NEW AVENUE  SAUDIA      2   900 5000000     3 
FIVE VISA ROAD      MEXICO      3   300 500000      7 
450 JACKSON BLVD        USA     3   1500    300000      4 
25 QUEENS ROAD SOUTH        SOUTH AFRICA        1   900 400000      3

얼핏 보면 깔끔하고 괜찮은 것 같습니다. 안타깝게도 다음과 같이 자세히 살펴보면 cat -A명령 프롬프트에 다음과 같은 내용이 표시됩니다.

$ cat -A original_file.tsv
35 EAST 23rd Street^I^ISOUTH AFRICA^I^I5^I600^I5000000^I^I6 $
83 NORTH YELLOWLIGHT AVENUE^ISOUTH AFRICA^I4^I700^I7000000^I^I5 $
777 NEW AVENUE^ISAUDIA^I^I2^I900^I5000000^I^I3 $
FIVE VISA ROAD^I^IMEXICO^I^I3^I300^I500000^I^I7 $
450 JACKSON BLVD^I^IUSA^I^I3^I1500^I300000^I^I4 $
25 QUEENS ROAD SOUTH^I^ISOUTH AFRICA^I^I1^I900^I400000^I^I3$
  • ^I"여기에 탭이 있습니다" 라는 의미
  • $"이것이 줄의 끝이다" 라는 뜻

그러면 다음과 같은 불일치가 즉시 드러납니다.

  • 행 1: 35 EAST 23rd Street탭 탭 SOUTH AFRICA...
  • 행 2: 83 NORTH YELLOWLIGHT AVENUESOUTH AFRICA...

한 행에는 필드 1과 필드 2를 구분하는 두 개의 탭이 있고, 다음 행에는 탭이 하나만 있습니다. 행마다 다릅니다.

sort그러나 각 행이 너무 다른 경우 각 행의 구분 기호 또는 구분 기호가 일관되지 않게 배열되면 여기에서 데이터를 올바르게 가져올 수 있는 방법이 없습니다.

클린 버전

(적어도 이 예에서는) 유일한 문제는 이중 탭이 나타나는 것 같지만 실제로는 단일 탭이어야 합니다. 따라서 가능하면 수동 편집 대신 도구를 사용하여 정리해야 합니다. 여기서는 sed이를 정리하고 결과를 파일에 저장할 수 있습니다. 예를 들어 results를 호출할 수 있습니다 clean_file.tsv.

$ sed 's/\t\t/\t/g;s/ $//g' original_file.tsv  > clean_file.tsv
  • s/\t\t/\t/g두 개의 탭을 검색하여 하나로 대체
  • ;sed 매개변수에서 여러 명령을 구분합니다.
  • s/ $//g일부 줄 끝에 공백이 있는 것 같아서 여기서는 삭제하겠습니다.
  • >파일 리디렉션은 sed출력을 파일에 저장합니다.clean_file.tsv

clean_file.tsv좋다:

35 EAST 23rd Street SOUTH AFRICA    5   600 5000000 6
83 NORTH YELLOWLIGHT AVENUE SOUTH AFRICA    4   700 7000000 5
777 NEW AVENUE  SAUDIA  2   900 5000000 3
FIVE VISA ROAD  MEXICO  3   300 500000  7
450 JACKSON BLVD    USA 3   1500    300000  4
25 QUEENS ROAD SOUTH    SOUTH AFRICA    1   900 400000  3

다시 사용할 수 있지만 cat -A지금은 다음에서 사용할 수 있습니다 clean_file.tsv.

35 EAST 23rd Street^ISOUTH AFRICA^I5^I600^I5000000^I6$
83 NORTH YELLOWLIGHT AVENUE^ISOUTH AFRICA^I4^I700^I7000000^I5$
777 NEW AVENUE^ISAUDIA^I2^I900^I5000000^I3$
FIVE VISA ROAD^IMEXICO^I3^I300^I500000^I7$
450 JACKSON BLVD^IUSA^I3^I1500^I300000^I4$
25 QUEENS ROAD SOUTH^ISOUTH AFRICA^I1^I900^I400000^I3$

이제 모든 것이 일관성이 있음을 알 수 있습니다. 주의 깊게 계산하면 이제 각 행에는 필드 구분 기호 또는 필드 구분 기호와 동일한 수의 필드(여기서는 6개)와 동일한 수의 탭(여기서는 5개)이 있습니다.

아, 정렬해

이제 clean_file.tsv입력 형식이 올바르게 지정되었으므로 명령을 실행하여 다음을 확인할 수 있습니다.

$ awk '/SOUTH AFRICA/ {print }' clean_file.tsv | sort -t $'\t' -k5,5n
25 QUEENS ROAD SOUTH    SOUTH AFRICA    1       900     400000  3
35 EAST 23rd Street     SOUTH AFRICA    5       600     5000000 6
83 NORTH YELLOWLIGHT AVENUE     SOUTH AFRICA    4       700     7000000 5
  • -F필드 작업이 수행되지 않으므로 여기서는 필요하지 않고 일치하는 행을 인쇄하는 데만 사용 -F되는 필드 구분 기호를 지정 하는 데 사용되었기 때문에 원래 명령과 비교하여 제거되었습니다.awkSOUTH AFRICA
  • -t $'\t'필드 구분 기호를 탭으로 지정합니다.
  • -k5,5이 경우 마지막에서 두 번째 열을 원하고 여기서 열 5는 이 6개 열 데이터 샘플에서 마지막에서 두 번째 열이므로 열 5에서 열 5로 정렬합니다.
  • n숫자 순서를 나타냅니다. 기본값은 오름차순이므로 더 이상 지정할 필요가 없습니다.

따라서 원시 데이터를 정리하고 이 awk합계를 실행하면 sort이제 항목을 찾아 SOUTH AFRICA다섯 번째 필드를 기준으로 오름차순으로 정렬할 수 있습니다.

답변2

여기에는 두 가지 기본적인 질문이 있습니다.

  1. 제공한 항목에는 필드 구분 기호가 없으므로 "열 5"는 의미가 없습니다. "열" 개념을 이해하려면 데이터를 편집해야 합니다(예: 열 사이에 세미콜론 사용). 저는 일반적으로 탭을 열 구분 기호로 사용하지만 데이터에 표시되지 않는 모든 문자를 사용할 수 있습니다.
  2. 필드 구분 기호가 무엇인지 정렬해야 합니다.

데이터를 편집한 후 다음과 같이 요구하는 작업을 수행할 수 있습니다.

% grep "SOUTH AFRICA" file | sort "-t;" -k5n

("파일"에 데이터가 포함되어 있다고 가정). 그러면 다음과 같은 출력이 제공됩니다.

25 QUEENS ROAD SOUTH;SOUTH AFRICA;1;900;400000;3
35 EAST 23rd Street SOUTH AFRICA;5;600;5000000;6 
83 NORTH YELLOWLIGHT AVENUE;SOUTH AFRICA;4;700;7000000;5 

남아프리카공화국이 두 번째 열에만 있는지 확인하려면 다음을 수행하세요.

% awk '-F;' '$2 == "SOUTH AFRICA"' file | sort '-t;' -k5n

관련 정보