Linux 如果一个文件有两列,而另一个文件有一列,有没有办法找到两个文件之间的公用行?文件太大,无法在R中工作
我在Linux中有两个文件 一个文件有两列和3亿行,另一个文件有一列和1498行(来自HG19的SNPs rs ID) 第一个文件如下所示。第一列有坐标,在相关值(1:10019:TA:T)之间有冒号,第二列有ID(rs775809821) 第二个文件只有一列,如下所示Linux 如果一个文件有两列,而另一个文件有一列,有没有办法找到两个文件之间的公用行?文件太大,无法在R中工作,linux,grep,Linux,Grep,我在Linux中有两个文件 一个文件有两列和3亿行,另一个文件有一列和1498行(来自HG19的SNPs rs ID) 第一个文件如下所示。第一列有坐标,在相关值(1:10019:TA:T)之间有冒号,第二列有ID(rs775809821) 第二个文件只有一列,如下所示 rs11234969 rs372076 rs10417746 rs2476601 rs10760127 我想将第二个文件中的值与第一个文件中的值进行匹配,这样我就可以得到一个最终文件,其中包含文件2中所有可能的行以及文
rs11234969
rs372076
rs10417746
rs2476601
rs10760127
我想将第二个文件中的值与第一个文件中的值进行匹配,这样我就可以得到一个最终文件,其中包含文件2中所有可能的行以及文件1中的坐标
我尝试过“grep”和awk,但没有成功
grep -F file1.txt file2.txt | cut -d ' ' -f1 > grep.txt
最后一个文件应该有所有可能的ID(rs…),这些ID在两个文件中都是相同的,并且都有坐标。这将输出每个文件的ID,例如:
rs11234969.txt
,rs372076.txt
,等等。每个文件都包含文件one.txt的相关ID和类似ID的格式
#!/bin/bash
while read line
do
awk -v line=$line '{if($2==line)print $0}' one.txt >${line}.txt
done <two.txt
#/bin/bash
读行时
做
awk-v line=$line'{if($2==line)print$0}'one.txt>${line}.txt
完成以下是纠正错误的命令:
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
看起来好像坐标中没有任何ID特征。所以你自己的方法非常接近,我只是建议做一点小小的改变
grep -f file2 file1 > new_file
问题是,您确实不想使用包含3亿行的文件作为模式文件,首先是因为它有永远不匹配的额外数据(坐标),但也因为它的大小。在示例数据中,file2
中的rs
值在file1
中都不可用。第二个文件很小,很容易装入RAM。我建议使用perl来完成这项任务,但在任何语言中都可以使用相同的方法。1.将第二个文件读入关联数组2。循环浏览大文件中的行,将每行拆分为列。对于关联数组中存在ID列的每一行,打印该行。在Perl中,即使你不使用尾随的成语,也可以是大约7到8行代码总量。你可以使用GNUAWK或者使用C程序或C++程序使用或考虑。也许32GB的RAM可能有用。顺便说一句,您的任务可能与相关-通过电子邮件与我联系至basile@starynkevitch.net
但请提及问题的URL,并用几段书面英语解释细节和上下文。我不知道什么是HG19
grep -f file2 file1 > new_file