파일이 2개 있는데 첫 번째 줄은 참조용 헤더 줄입니다.
file1
userId userContact parentId parentContact 200 0900200 100 - 201 0900201 100 - 300 0900300 101 -
file2
userId userContact parentId parentContact 100 0900100 100 - 101 0900101 100 -
네 번째 열에서는 in을 file1
검색한 다음 of를 from으로 바꿔야 하므로 출력은 다음과 같아야 합니다.$3
file1
$1
file2
$2
file2
$4
file1
output
userId userContact parentId parentContact 200 0900200 100 0900100 201 0900201 100 0900100 300 0900300 101 0900101
awk
더 빠르기 때문에 선호합니다 .
답변1
사용 join
(정렬된 입력 파일이 필요하므로 정렬된 입력을 전달했습니다).
join -1 3 -2 1 -o 1.1,1.2,1.3,2.2 <(sort -k3 file1) <(sort file2)
200 0900200 100 0900100
201 0900201 100 0900100
300 0900300 101 0900101
를 사용하면 Join은 -1 3
첫 번째 입력 파일(file1)의 키로 세 번째 열을 선택하고, 두 번째 입력 파일(file2)의 키로 -2 1
첫 번째 열을 선택한 다음 -o
이러한 열을 출력합니다 .<파일번호>.<열번호>.
입력 내용이 탭으로 구분된 파일인 경우 -t$'\t'
결합 명령에도 추가하세요 sort -k3 file1
.
헤더 줄을 인쇄하려면 head -n1 file1;
결합 앞에 추가하세요.
또는 다음을 사용하십시오 awk
.
awk 'NR==FNR{ parentId[$1]=$2; next }
FNR>1 { $4=parentId[$3] }1' file2 file1
답변2
$ awk 'NR==FNR { keep[$1] = $2 ; next};
FNR==1 {print;next};
{ $4 = keep[$3]; print }' file2 file1
userId userContact parentId parentContact
200 0900200 100 0900100
201 0900201 100 0900100
300 0900300 101 0900101
이는 에서 읽어 file2
각 행의 필드 2를 이름이 지정된 배열에 저장합니다 keep
(필드 1의 값으로 인덱싱됨). 읽기가 끝나면 file2
읽기를 시작합니다 file1
. 첫 번째 줄(헤더 줄)을 인쇄한 다음 각 후속 입력 줄에 대해 필드 4를 값으로 변경 keep[$3]
하고 인쇄합니다.
스크립트는 읽고 있는지 감지하기 위해 file2
테스트합니다 . NR==FNR
awk의 FNR
변수에는 현재 파일의 현재 줄 번호와 NR
지금까지 읽은 모든 파일의 누적 총 줄 번호가 포함됩니다. 따라서 FNR이 NR과 같으면 첫 번째 파일을 읽는 것입니다(즉 file2
, 첫 번째 파일 이름 인수로 나열되어야 하는 이유입니다). 이 테스트가 제대로 작동하지 않는 꽤 모호한 경우가 있지만 대부분(이 테스트를 포함하여)에는 괜찮습니다.
입력 또는 출력 필드 구분 기호를 변경해야 하는 경우 awk의 -F 및 -v 옵션을 사용할 수 있습니다. 예를 들어 -F'\t'
및/또는 -v OFS='\t'
.