필드 번호가 다른 두 파일 결합

필드 번호가 다른 두 파일 결합

두 개의 파일이 있습니다: s2.txt

14 3KC12828ACBA 
43 8DG59242BAAD 
25 8DG60566AAAF 
6 8DG60912AAAF

그리고 pbas.txt:

3AG33662AAAC
3KC12828ACBA
8DG59242BAAD
8DG60349AAAC
8DG60565AAAG
8DG60566AAAF
8DG60568AAAC
8DG60912AAAF
8DG62635AAAC

UNIX에서 bash를 사용하여 파일을 결합하여 다음과 같은 파일을 얻고 싶습니다.

3AG33662AAAC
3KC12828ACBA 14
8DG59242BAAD 43
8DG60349AAAC
8DG60565AAAG
8DG60566AAAF 25
8DG60568AAAC
8DG60912AAAF 6
8DG62635AAAC

어떻게 할 수 있나요?

답변1

이것은 join:

join -2 2 -a 1 pbas.txt s2.txt

옵션은 다음과 같이 말합니다.

  • -2 2:두 번째 파일은 두 번째 열을 사용하여 키를 저장합니다.
  • -a 1: 파일 2에 일치하는 항목이 없더라도 파일 1의 모든 행을 출력합니다.

답변2

AWK

awk에서는 이 작업을 수행하는 것이 매우 쉽습니다.

$ awk 'NR==FNR{a[$2]=$1; next}{print $1,a[$1]}' file1.txt file2.txt    
3AG33662AAAC
3KC12828ACBA 14
8DG59242BAAD 43
8DG60349AAAC
8DG60565AAAG
8DG60566AAAF 25
8DG60568AAAC
8DG60912AAAF 6
8DG62635AAAC

화려한 것은 없습니다. 이 기술은 awk정기적으로 작업하는 사람들, 특히 여러 파일로 작업할 때 자주 사용되며 첫 번째 파일의 정보를 배열로 로드하는 아이디어를 기반으로 합니다.

작동 방식은 간단합니다. 먼저 NR==FNR(현재 처리된 줄 번호와 현재 파일의 줄 번호 간의 비교)를 사용하여 file1.txt(OP의 예에서 s2.txt) 모든 것을 연관 값 배열로 읽습니다. next키워드를 사용하면 첫 번째 파일에서 다음 코드 블록을 건너뛸 수 있습니다. 첫 번째 파일을 종료하면 다음 코드 블록이 실행되어 항상 필드 1을 인쇄하고 배열에 해당 항목이 있으면 인쇄합니다.

진주

awk와 비슷한 아이디어를 사용하면 다음과 같이 Perl에서도 비슷한 결과를 얻을 수 있습니다.

perl -lane 'if($F[1]){$hash{$F[1]}=$F[0]}else{print "$_ $hash{$_}"}' file1.txt file2.txt

관련 정보