두 개의 파일(열이 2개인 파일과 열이 3개인 파일)의 데이터를 비교합니다.

두 개의 파일(열이 2개인 파일과 열이 3개인 파일)의 데이터를 비교합니다.

두 개의 파일이 있습니다.

파일 1:

Chromosome   Position
Chr1    5242097
Chr1    4876397
Chr1    9474943
Chr1    8494518
Chr1    39872693
Chr1    9445153
Chr1    23044399
Chr1    8018859
Chr1    9474943
Chr1    42380010
Chr1    9474943
Chr1    22677151
Chr1    23044399
Chr1    42380010

파일 2:

Chr1    1   0
Chr1    2   0
Chr1    3   0
Chr1    4   0
Chr1    5   0
Chr1    6   0
Chr1    7   0
Chr1    8   0
Chr1    9   0
Chr1    10  0
Chr1    11  0
Chr1    12  0
Chr1    13  0
Chr1    14  0
Chr1    15  0
Chr1    16  0
Chr1    17  0
Chr1    18  0
Chr1    19  0
Chr1    20  0
Chr1    21  0
Chr1    22  0
Chr1    23  0
Chr1    24  0
Chr1    25  0
Chr1    26  0
Chr1    27  0
Chr1    28  0
Chr1    29  0
Chr1    30  0
Chr1    31  0
Chr1    32  0
Chr1    33  0
Chr1    34  0
Chr1    35  0
Chr1    36  0
Chr1    37  0
Chr1    38  0
Chr1    39  0
Chr1    40  0
Chr1    41  0
Chr1    42  0
Chr1    43  0
Chr1    44  0
Chr1    45  0
Chr1    46  0
Chr1    47  0
Chr1    48  0
Chr1    49  0
Chr1    50  0

File2는 용량이 꽤 커서 전체 내용을 보여주지는 않습니다. 이 숫자는 6자리 이상까지 늘어날 수 있습니다.

file1의 두 번째 열과 일치하는 경우 file2에서 세 번째 열을 가져오고 싶습니다.

나는 Perl 프로그램을 작성했지만 매우 느렸습니다. 나는 이것을 할 수 있는 빠른 방법을 찾고 있습니다. Grep도 매우 느립니다.

답변1

난 쓸수있다

awk '
    # store column 2 from the first file
    NR == FNR {pos[$2] = 1; next}

    # from the second file, print the 3rd field if it occurred in file1
    $3 in pos {print $3}
' file1 file2

답변2

파일 1에 col2만 유지

awk '{print $2}' file1 > file1_col2

그런 다음 col3을 file2에 유지합니다.

awk '{print $3}'  file2> file2_col3

이제 file2_col3에 나타나는 file1_col2 행을 검색하십시오.

grep -f file1_col2 file2_col3

답변3

느리다면 C++가 도움이 될 것입니다. 진지하게 C++는 빠른 것을 작성하는 데에도 사용될 수 있습니다 =). file.cc에 저장하고 컴파일하고 파일 디렉터리에서 실행합니다 . g++ file.cc -O2 -o file두 번째 것을 컴파일 전에 필요한 파일 이름으로 ./file바꿉니다 .firstfilename

속도 면에서는 C++를 이길 수 없습니다 =)

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
   ifstream f1("firstfilename"), f2("secondfilename");
   string s;
   int i1, i2, line=0;
   while (!f1.eof()) {
      line++;
      if (f2.eof()) {
         cout << "Length different!" << "\n";
      }
      f1>>s>>i1;
      f2>>s>>i2>>i2;
      if (i1 != i2) {
         cout << "Not matching line " << line << " " << i1 << "<>" << i2 << "\n";
      }
   }
}

답변4

사용join, 포함하다sort데이터가 적절한 필드로 정렬되지 않은 경우.

join -1 2 -2 3 -o 2.3 <(sort -k2,2 file1) <(sort -k3,3 file2)

필요하지 않은 경우 sort:

join -1 2 -2 3 -o 2.3 file1 file2

이는 GNU 유틸리티를 사용하여 수행됩니다. 다른 변형의 경우 어떤 Unix를 사용하고 있는지 알아야 합니다. 위 버전은 sortBash 프로세스 교체를 보여 주며, 다른 일부 셸에서도 작동합니다.

조인 필드도 출력 필드이므로 -o 2.3로 단순화할 수 있습니다 -o 0.

관련 정보