파일 A의 내용을 변경하지 않고 파일 A의 열 3을 기준으로 파일 B를 정렬합니다.

파일 A의 내용을 변경하지 않고 파일 A의 열 3을 기준으로 파일 B를 정렬합니다.

다음 파일이 있습니다.

cat fileA.txt

seattle    1991  west
atlanta    1993  west
turlock    1998  west
marysville 2004  south
newyork    2007  north
canada     2004  west

두 번째 파일은 다음과 같습니다.

cat fileB.txt

popular
someWhatPopular
boring
popular
popular
popular

다음 출력을 얻고 싶습니다 fileB.txt.

popular popular popular someWhatPopular boring popular

그래서 본질적으로 저는 세 번째 열로 fileB.txt정렬 하려고 합니다.fileA.txt

다음 코드를 시도했습니다.

   #!/bin/bash
   sort -s -k3,3 fileA.txt fileB.txt

그러나 그것은 작동하지 않았습니다. 어떤 제안이 있으십니까? 나는 하드 코딩이 필요하지 않은 모든 것에 매우 개방적입니다. Bash/awk/sed 등

답변1

이것은 리눅스 문제보다 데이터 구조 문제입니다. '데이터베이스'에서와 마찬가지로 두 테이블을 연결하려면 두 테이블에 공통 항목(키)이 필요하며 모든 데이터 테이블의 첫 번째 열에 고유 키를 유지하는 것이 좋습니다. 그런 다음 하트 콘텐츠를 정렬하고 연결할 수 있습니다.

@glennjackman 매핑과 같은 것을 사용하여 매핑 키를 북쪽, 남쪽 등으로 정의합니다.

1 south somewhatPopular
2 west popular
3 north boring
4 east unexplored

file 이라는 파일에 popularity. fileA고유 키를 포함하도록 수정

1 seattle    1991  west
2 atlanta    1993  west
3 turlock    1998  west
4 marysville 2004  south
5 newyork    2007  north
6 canada     2004  west

그런 다음 선택한 키에 파일을 입력하여 이러한 파일을 조작할 수 있지만 join(귀하의 경우 2열은 popularity4열에 매핑됨 fileA) join 키 필드에서 두 파일을 모두 정렬해야 하므로

join -1 4 -2 2 <(sort -k4 fileA) <(sort -k2 popularity) | sort -k2 | awk '{print $6}'

popular
popular
popular
somewhatPopular
boring
popular

약간의 큰 망치 접근 방식이지만 가장 큰 유연성을 제공합니다.

각 파이프에서 위 명령을 중단하면 각 단계가 수행하는 작업을 볼 수 있습니다.

편집 : 설명join -1 4 -2 2 # its in the man pages

이는 join테이블 1의 4번째 열(-1 4)을 보고 테이블 2의 2번째 열(-2 2)에서 일치하는 값을 찾으라는 의미입니다.

join그런 다음 두 테이블의 열을 단일 테이블로 구성하지만 키 열(북쪽 등)만 한 번만 포함합니다. 의 출력을 살펴보세요.

join -1 4 -2 2 <(sort -k4 fileA) <(sort -k2 popularity)

그리고 그것은 더 명확해야

join가 작동 하려면 데이터 테이블을 정렬해야 했기 때문에

| sort -k2

결합된 테이블을 원래 순서대로 다시 배치합니다.

원하는 열은 결합된 테이블의 열 6이므로

| awk '{print $6}'

표준 출력으로.

답변2

paste두 개의 "테이블" 파일을 함께 사용하여 출력을 로 파이프한 sort다음 cut네 번째 열만 유지하려고 할 수 있습니다 .

테스트되지 않은 (현재 휴대폰) 시도는 다음과 같습니다.

paste fileA fileB | sort -s -k3,3 | cut -f4

답변3

다음을 사용하여 알파벳순 매핑을 얻을 수 있습니다.

paste <(awk '{print $NF}' fileA.txt | sort -u) <(sort -u fileB.txt)
north   boring
south   popular
west    someWhatPopular

그런 다음 awk를 사용하여 원하는 출력 형식을 생성할 수 있습니다.

awk '
    NR==FNR {map[$1] = $2; next} 
    {print map[$NF]}
' <(paste <(awk '{print $NF}' fileA.txt | sort -u) <(sort -u fileB.txt)) fileA.txt
someWhatPopular
someWhatPopular
someWhatPopular
popular
boring
someWhatPopular

관련 정보