0

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

第一个文件如下所示。第一列有坐标并且在坐标值之间有冒号 (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

我想将第二个文件中的值与第一个文件中的值相匹配,这样我就可以拥有一个最终文件,其中包含文件 2 中的所有可能行及其来自文件 1 的坐标。

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

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

最终文件应该包含所有可能的 ID (rs.....),这些 ID 在两个文件中都具有相同的坐标。

4

3 回答 3

0

这将输出每个文件的 ID,例如:rs11234969.txt,rs372076.txt等。每个文件都包含坐标和 ID,例如文件 one.txt 的格式

#!/bin/bash

while read line
do
    awk -v line=$line '{if($2==line)print $0}' one.txt >${line}.txt
done <two.txt
于 2021-05-04T15:22:17.813 回答
0

这是使事情正确的命令:

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
于 2021-05-04T15:49:11.003 回答
0

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

grep -f file2 file1 > new_file

问题是您真的不想使用具有 3 亿行的文件作为模式文件,首先是因为它具有永远不会匹配的额外数据(坐标),而且还因为它的大小。

于 2021-05-04T16:32:43.097 回答