比较内容并生成新文件

比较内容并生成新文件

我有两个文件包含以下内容:

File 1

OG5_126568
OG5_126583
OG5_126593
OG5_126596
OG5_126599
OG5_126609

File2

OG5_126568  psychrobacter_aquaticus.txt WP_021813339.1
OG5_126583  psychrobacter_aquaticus.txt WP_040642027.1
OG5_126583  psychrobacter_phenylpyruvicus.txt   WP_028858051.1
OG5_126585  psychrobacter_piscatorii.txt    WP_058023688.1
OG5_126593  psychrobacter_aquaticus.txt WP_021813641.1
OG5_126593  psychrobacter_aquaticus.txt WP_021814787.1
OG5_126593  psychrobacter_piscatorii.txt WP_021814787.1
OG5_126593  psychrobacter_phenylpyruvicus.txt   WP_021814787.1

我想将我的第一个文件与第二个文件进行比较,并生成一个仅包含匹配内容的新文件。

produced file

    OG5_126593  psychrobacter_aquaticus.txt WP_021813641.1
    OG5_126593  psychrobacter_aquaticus.txt WP_021814787.1
    OG5_126593  psychrobacter_piscatorii.txt WP_021814787.1
    OG5_126593  psychrobacter_phenylpyruvicus.txt   WP_021814787.1

我应该使用哪个命令?

在此处输入图片描述

答案1

grep可以配备文件包含要搜索的模式:

$ grep -f 1.txt 2.txt
OG5_126568  psychrobacter_aquaticus.txt WP_021813339.1
OG5_126583  psychrobacter_aquaticus.txt WP_040642027.1
OG5_126593  psychrobacter_aquaticus.txt WP_021813641.1
OG5_126593  psychrobacter_aquaticus.txt WP_021814787.1

这将打印2.txt包含 中给出的任何模式的每一行1.txt

答案2

如果两个文件都按第一列排序,则使用以下join命令:

join file1 file2

答案3

笔记:我已编辑了我的回复,我想我已经理解了这个问题。

磨坊主(此处为最新的 Linux 二进制文件https://github.com/johnkerl/miller/releases/download/5.4.0/mlr.linux.x86_64)你可以开始收集文件数量

mlr --nidx --fs ' ' --repifs cut -f 2 then uniq -a 2.txt | wc -l >./filesnumber.txt

他们是 3:

psychrobacter_aquaticus.txt
psychrobacter_phenylpyruvicus.txt
psychrobacter_piscatorii.txt

然后你可以用

mlr --nidx --fs ' ' --repifs cut -f 1,2 then uniq -a 2.txt >./distinctValues.txt

这些都是

OG5_126568 psychrobacter_aquaticus.txt
OG5_126583 psychrobacter_aquaticus.txt
OG5_126583 psychrobacter_phenylpyruvicus.txt
OG5_126585 psychrobacter_piscatorii.txt
OG5_126593 psychrobacter_aquaticus.txt
OG5_126593 psychrobacter_piscatorii.txt
OG5_126593 psychrobacter_phenylpyruvicus.txt

然后,您可以仅过滤字段 1 中不同值计数为 3 的记录

mlr --nidx --ifs ' ' --repifs cut -f 1 then count-distinct -f 1 \
then filter '$count=='"$(cat filesnumber.txt)"'' \
then cut -f 1 distinctValues.txt >./okValue.txt

它可以给你你想要的东西:OG5_126593

最后你可以应用连接

mlr --nidx --fs ' ' --repifs join -j 1 -f okValue.txt 2.txt

这让你回

OG5_126593 psychrobacter_aquaticus.txt WP_021813641.1
OG5_126593 psychrobacter_aquaticus.txt WP_021814787.1
OG5_126593 psychrobacter_piscatorii.txt WP_021814787.1
OG5_126593 psychrobacter_phenylpyruvicus.txt WP_021814787.1

我已经使用了这两个输入文件

OG5_126568
OG5_126583
OG5_126593
OG5_126596
OG5_126599
OG5_126609


OG5_126568  psychrobacter_aquaticus.txt WP_021813339.1
OG5_126583  psychrobacter_aquaticus.txt WP_040642027.1
OG5_126583  psychrobacter_phenylpyruvicus.txt   WP_028858051.1
OG5_126585  psychrobacter_piscatorii.txt    WP_058023688.1
OG5_126593  psychrobacter_aquaticus.txt WP_021813641.1
OG5_126593  psychrobacter_aquaticus.txt WP_021814787.1
OG5_126593  psychrobacter_piscatorii.txt WP_021814787.1
OG5_126593  psychrobacter_phenylpyruvicus.txt   WP_021814787.1

答案4

我已经更新了我的问题。它应该将 1.txt 与 2.txt 的每一行进行比较,并且只打印那些完全匹配的行。例如 OG5_126568 存在于 psychrobacter_aquaticus.txt 中,但它不存在于 psychrobacter_phenylpyruvicus.txt 中,因此不应打印。OG5_126593 存在于每个 *.txt 中,因此应该打印。

我会以不同的方式看待这个问题:

  1. 您有 N 个不同的*.txt文件。N 可以通过以下方式获取:

    N=$(awk '{print $2}' <file2 | sort | uniq | wc -l)
    
  2. 如果一个密钥必须出现在所有*.txt文件中,那么对于这样的密钥,你应该找到 N不同的key-txt 对(独立于 WP-* 部分)。对于每个键,可以像这样获取此数字:

    awk '{print $1 " " $2}' <file2 | sort | uniq | awk '{print $1}' | uniq -c
    

    因此出现 N 次的键可以通过以下方式获得:

    awk '{print $1 " " $2}' <file2 | sort | uniq | awk '{print $1}' | uniq -c | grep -E "^\s+$N" | awk '{print $2}'
    
  3. 然后,您可以使用此键列表file2通过join或进行过滤grep -f,如果需要,还可以使用进行再次过滤,file1以确保您只有来自的键file1(但我认为这file1可能没有必要)。

相关内容