아래와 같이 두 개의 파일이 있습니다. 해당 호스트 이름과 일치하도록 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
논리는 동일합니다.
- 첫 번째 단계에서는 ID 값을 포함하고 이름 값으로 인덱싱된 배열을 만듭니다.
- 두 번째 패스에서는 이름을 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
.