有没有办法在两个文件之间找到公共行,其中一个文件有两列,另一个有一列?文件很大,无法在R中工作



我在Linux中有两个文件一个文件有两列和3亿行,另一个文件只有一列和1498行(SNPs的ID来自HG19(。

第一个文件如下所示。第一列有坐标,坐标值之间有冒号(1:10019:TA:T(,第二列有ID(rs775809821(

1:10019:TA:T    rs775809821
1:10039:A:C     rs978760828
1:10043:T:A     rs1008829651
1:10051:A:G     rs1052373574
1:10055:T:A     rs892501864
1:10055:T:TA    rs768019142
1:10165:A:AC    rs796884232

第二个文件只有一列,看起来像这个

rs11234969
rs372076
rs10417746
rs2476601
rs10760127

我想将第二个文件中的值与第一个文件中值相匹配,这样我就可以得到一个最终文件,该文件包含文件二中所有可能的行以及文件一中的坐标。

我尝试过grep和awk,但没有成功。

grep -F file1.txt file2.txt | cut -d ' ' -f1 > grep.txt

最后一个文件应该具有所有可能的ID(rs…..(,这些ID在两个文件中都是通用的,也有坐标。

这将输出每个文件的ID,例如:rs11234969.txtrs372076.txt等。每个文件都包含corrdinates和文件one.txt 的类似ID的格式

#!/bin/bash
while read line
do
awk -v line=$line '{if($2==line)print $0}' one.txt >${line}.txt
done <two.txt

看起来坐标中没有任何ID。所以你自己的方法相当接近,我只是建议做一个小的改变。

grep -f file2 file1 > new_file

问题是,确实不想使用具有3亿行的文件作为模式文件,首先是因为它有永远不会匹配的额外数据(坐标(,但也因为它的大小。

以下是使事情正确的命令:

grep -wnF -f file2.txt file1.txt > grep.txt

输出将包含文件file1.txt中的行号,后跟冒号和相应的行。

请注意,这要求file2.txt不包含空行,并且这些行不被空格或其他空白/隐藏符号包围。如果上述某些条件不成立,请使用以下方法:

sed 's/^[ t]*([^ t]*)[ t]*$/1/; /^[ t]*$/d' file2.txt | 
grep -wnF -f /dev/stdin file1.txt > grep.txt

最新更新