我有两个文件包含以下内容:
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 中,因此应该打印。
我会以不同的方式看待这个问题:
您有 N 个不同的
*.txt
文件。N 可以通过以下方式获取:N=$(awk '{print $2}' <file2 | sort | uniq | wc -l)
如果一个密钥必须出现在所有
*.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}'
然后,您可以使用此键列表
file2
通过join
或进行过滤grep -f
,如果需要,还可以使用进行再次过滤,file1
以确保您只有来自的键file1
(但我认为这file1
可能没有必要)。