파일 1의 값을 파일 2의 값과 일치시키고 파일 1에 추가할 관련 정보를 얻으려면 어떻게 해야 합니까?

파일 1의 값을 파일 2의 값과 일치시키고 파일 1에 추가할 관련 정보를 얻으려면 어떻게 해야 합니까?

파일이 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으로 바꿔야 하므로 출력은 다음과 같아야 합니다.$3file1$1file2$2file2$4file1

  • 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==FNRawk의 FNR변수에는 현재 파일의 현재 줄 번호와 NR지금까지 읽은 모든 파일의 누적 총 줄 번호가 포함됩니다. 따라서 FNR이 NR과 같으면 첫 번째 파일을 읽는 것입니다(즉 file2, 첫 번째 파일 이름 인수로 나열되어야 하는 이유입니다). 이 테스트가 제대로 작동하지 않는 꽤 모호한 경우가 있지만 대부분(이 테스트를 포함하여)에는 괜찮습니다.

입력 또는 출력 필드 구분 기호를 변경해야 하는 경우 awk의 -F 및 -v 옵션을 사용할 수 있습니다. 예를 들어 -F'\t'및/또는 -v OFS='\t'.

관련 정보