본문에서:
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 AVENUE
탭SOUTH 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
되는 필드 구분 기호를 지정 하는 데 사용되었기 때문에 원래 명령과 비교하여 제거되었습니다.awk
SOUTH AFRICA
-t $'\t'
필드 구분 기호를 탭으로 지정합니다.-k5,5
이 경우 마지막에서 두 번째 열을 원하고 여기서 열 5는 이 6개 열 데이터 샘플에서 마지막에서 두 번째 열이므로 열 5에서 열 5로 정렬합니다.n
숫자 순서를 나타냅니다. 기본값은 오름차순이므로 더 이상 지정할 필요가 없습니다.
따라서 원시 데이터를 정리하고 이 awk
합계를 실행하면 sort
이제 항목을 찾아 SOUTH AFRICA
다섯 번째 필드를 기준으로 오름차순으로 정렬할 수 있습니다.
답변2
여기에는 두 가지 기본적인 질문이 있습니다.
- 제공한 항목에는 필드 구분 기호가 없으므로 "열 5"는 의미가 없습니다. "열" 개념을 이해하려면 데이터를 편집해야 합니다(예: 열 사이에 세미콜론 사용). 저는 일반적으로 탭을 열 구분 기호로 사용하지만 데이터에 표시되지 않는 모든 문자를 사용할 수 있습니다.
- 필드 구분 기호가 무엇인지 정렬해야 합니다.
데이터를 편집한 후 다음과 같이 요구하는 작업을 수행할 수 있습니다.
% 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