두 개의 파일이 있습니다: 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