두 개의 파일이 있습니다.
파일 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를 사용하고 있는지 알아야 합니다. 위 버전은 sort
Bash 프로세스 교체를 보여 주며, 다른 일부 셸에서도 작동합니다.
조인 필드도 출력 필드이므로 -o 2.3
로 단순화할 수 있습니다 -o 0
.