순서가 다른 두 파일의 데이터를 병합합니다.

순서가 다른 두 파일의 데이터를 병합합니다.

아래와 같이 두 개의 파일이 있습니다. 해당 호스트 이름과 일치하도록 file1에서 file2까지 ID 번호를 적용해야 합니다. 필요한 출력도 아래에 있습니다. 가능하다면 bash 스크립트를 사용하여 이 작업을 수행하는 것을 선호하지만 대안이 있습니다.

파일 1:

ID: 12345, Name: foo1.bar.com
ID: 12346, Name: foo2.bar.com
ID: 12347, Name: foo3.bar.com
ID: 12348, Name: foo4.bar.com
ID: 12349, Name: foo5.bar.com

파일 2:

foo3.bar.com
foo4.bar.com
foo1.bar.com
foo5.bar.com
foo2.bar.com

원하는 출력 -

12347 foo3.bar.com
12348 foo4.bar.com
12345 foo1.bar.com
12349 foo5.bar.com
12346 foo2.bar.com

이 문제를 해결하는 가장 좋은 방법에 대한 아이디어가 있습니까?

답변1

첫 번째 파일에서 조회 테이블/해시/연관 ​​배열을 만들고 두 번째 파일의 내용을 사용하여 입력합니다.

awk -F'[ ,]+' 'NR==FNR {a[$NF] = $2; next} $1 in a {print a[$1], $1}' file1 file2
12347 foo3.bar.com
12348 foo4.bar.com
12345 foo1.bar.com
12349 foo5.bar.com
12346 foo2.bar.com

답변2

샘플 파일에 따르면,스틸 드라이버의 답변 (에서 조회 테이블/연관 배열을 사용하는 것 awk)이 아마도 가장 좋은 솔루션일 것입니다. 이는 일반적으로 권장되지 않지만 bash에서만 동일한 작업을 수행할 수 있습니다.

declare -A id
while IFS=" ," read x idnum xx name
do
        id[$name]=$idnum
done < file1
while read name
do
        printf '%s %s\n' "${id[$name]}" "$name"
done < file2

논리는 동일합니다.

  1. 첫 번째 단계에서는 ID 값을 포함하고 이름 값으로 인덱싱된 배열을 만듭니다.
  2. 두 번째 패스에서는 이름을 ID에 매핑하고 나란히 출력합니다.

질문의 예제 데이터에 대해 내 대답은 예상대로(즉, 지정된 대로) 작동합니다. (배열, 특히 연관 배열을 사용하기 때문에 bash(또는 ksh, zsh 또는 yash)가 필요합니다. 쉘에 대한 POSIX 사양은 배열을 지정하지 않으며 Unix/.Linux에서 사용되는 모든 쉘에서 사용할 수 없습니다.) bash 명령이 작동하는 방식으로 인해 read내 대답은 직관적으로 예상할 수 있듯이 여러 단어로 구성된 이름(예: 공백이 있는 이름)도 처리합니다.

        file1                             file2                    output

ID: 42, Name: fat cat                   fat cat                  42 fat cat
ID: 95, Name: Superman                  under dog                83 under dog
ID: 83, Name: under dog                 spider man      ⟹       17 spider man
ID:  9, Name: cat woman                 spider pig               60 spider pig
ID: 17, Name: spider man                Superman                 95 Superman
ID: 60, Name: spider pig                cat woman                9 cat woman

두 답변 모두 대소문자를 foo1.bar.com구분합니다 Foo1.bar.com.

관련 정보