grep, awk, sed, file1과 file2의 열 2와 열 3 사이의 일치를 인쇄합니다.

grep, awk, sed, file1과 file2의 열 2와 열 3 사이의 일치를 인쇄합니다.

편집: 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를 사용하여 파일을 비교하고 일치 항목을 인쇄하는 방법에 대한 좋은 개요를 제공합니다.

두 파일의 일치하는 줄을 비교하고 긍정적인 결과를 저장합니다.

관련 정보