한 파일의 내용을 반복적으로 찾아 다른 파일의 키로 바꿉니다.

한 파일의 내용을 반복적으로 찾아 다른 파일의 키로 바꿉니다.

한 파일을 입력으로 사용하여 다른 파일을 찾아서 바꿔야 합니다. 다음 명령은 이 작업을 수행하지만 각 행의 첫 번째 열에 대해서만 수행됩니다. 모든 열에 대해 이런 일이 발생해야 합니다.

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{$1=a[$1];print}' OFS=',' file1 file2 > fileout

두 파일은 다음과 같습니다

파일 1(키):

0,name0
1,name1
2,name2
3,name3
4,name4

파일 2:

23,45,0
41,1,2,4
4,5,22,100
10,20,31,51,1
33,3
16,111,3

출력은 다음과 같아야 합니다.

23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3

답변1

이것은 작동합니다:

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{for (i=1;i<=NF;i++) $i=a[$i];print}' OFS=',' file1 file2 > fileout

감사해요

답변2

위의 방법으로는 효과가 없을 것 같습니다. 내 시스템의 결과:

,,name0
,name1,name2,name4
name4,,,
,,,,name1
,name3
,,name3

시도 해봐

awk -F',' 'NR==FNR{a[$1]=$2; next} {for (i=1;i<=NF;i++) if (a[$i]) $i=a[$i]} 1' OFS=',' file1 file2
23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3

답변3

이 작업은 다음을 통해 수행할 수도 있습니다 sed.

sed -f <(sed 's|,|$/,|;s|^|s/,|;s|$|/|' f1) f2

Kusalananda가 지적했듯이 이 솔루션은 모든 일반 쉘에서 지원되지 않는 프로세스 대체를 사용합니다. 그러나 동일한 효과를 얻는 다른 방법이 있습니다.

어떻게 작동하나요? 기본 아이디어는 파일을 프로그램 f1으로 변환하여 sed파일을 변환하는 것입니다 f2. 괄호 안의 명령은 sed파일의 각 줄을 명령 f1으로 변환합니다 s///.

관련 정보