편집: file1.txt의 열 1,2를 file2.txt의 열 1,3과 일치시키고 file2.txt의 일치하는 줄을 인쇄하고 싶습니다.
파일 1.txt:
scaffold1 57482
scaffold1 63114
scaffold1 63118
scaffold1 63129
scaffold1 63139
scaffold1 63279
scaffold1 63294
scaffold2 65015
scaffold2 77268
scaffold2 77335
파일 2.txt:
scaffold1 381 382 T/A +
scaffold1 384 385 T/A,G +
scaffold1 385 386 G/C +
scaffold1 445 446 C/T +
scaffold1 57481 57482 T/A +
scaffold1 63113 63114 T/A,G +
scaffold1 63128 63129 G/C +
scaffold2 65014 65015 G/A +
scaffold2 77267 77268 G/A +
scaffold2 77334 77335 C/T +
출력.txt:
scaffold1 57481 57482 T/A +
scaffold1 63113 63114 T/A,G +
scaffold1 63128 63129 G/C +
scaffold2 65014 65015 G/A +
scaffold2 77267 77268 G/A +
scaffold2 77334 77335 C/T +
답변1
해결책 awk
:
$ awk 'NR==FNR{a[$1$2]++;next}{if($1$3 in a){print}}' file1 file2
scaffold1 57481 57482 T/A +
scaffold1 63113 63114 T/A,G +
scaffold1 63128 63129 G/C +
scaffold2 65014 65015 G/A +
scaffold2 77267 77268 G/A +
scaffold2 77334 77335 C/T +
NR
현재 줄 번호와 FNR
현재 파일의 현재 줄 번호입니다. 둘은 첫 번째 파일을 읽을 때만 동일합니다. 따라서 첫 번째 블록은 첫 번째 파일을 읽을 때만 실행되므로 첫 번째 파일의 첫 번째 및 두 번째 필드가 배열에 저장됩니다 a
. 그런 다음 두 번째 파일을 처리할 때 첫 번째와 세 번째 필드가 있는 경우에만 해당 행을 인쇄합니다. 즉, a
첫 번째 파일에 있는 경우에만 해당 행을 인쇄합니다.
답변2
예시 데이터가 일반화되면 다음과 같이 몇 가지 가정을 할 수 있습니다.
- 파일 1의 열 2를 파일 2의 열 3과 일치시키기만 하면 됩니다.
- 입력 파일은 위의 열을 기준으로 정렬됩니다.
이러한 가정이 합리적이면 다음 join
명령이 작동합니다.
join -1 2 -2 3 -o "1.1,2.2,2.3,2.4,2.5" file1.txt file2.txt > output.txt
출력은 다음과 같습니다
scaffold1 57481 57482 T/A +
scaffold1 63113 63114 T/A,G +
scaffold1 63128 63129 G/C +
scaffold2 65014 65015 G/A +
scaffold2 77267 77268 G/A +
scaffold2 77334 77335 C/T +
또는 이러한 가정이 유효한 가정이 아닌 경우 awk
열을 약간 재배열한 다음(구체적으로 파일 1의 열 1,2와 파일 2의 열 1,3을 결합) 다음 sort
(요구 사항에 따라 join
)을 수행할 수 있습니다. 그러면 join
결합된 열이 일치됩니다.
join -o "1.2,2.2,2.3,2.4,2.5" <( awk '$1=$1"_"$2" "$1' file1.txt | sort ) <( awk '$1=$1"_"$3' file2.txt | sort )
답변3
필수 필드를 캡처하려면 "cut"을 사용해 보십시오. 예를 들면 다음과 같습니다.
cut -d$"\t" -f2 file1.txt | sort | > file1_col2.txt
사용자 cuonglm은 awk를 사용하여 파일을 비교하고 일치 항목을 인쇄하는 방법에 대한 좋은 개요를 제공합니다.