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