我的Linux机器上有两个文件。第一个“list.txt”包含对象列表(2649个对象),而第二个“list_interactors.txt”包含一个较短的列表,其中包含之前列表中的一些对象(719个对象)。对于每个对象,其他列中都有一些相关联的变量。我想在文件“list_interactors”中列出所有对象(2649)以及特定对象的相关变量。

例子:

文件列表.txt

6轮胎_A_002__________2009年2月7日__________2001年9月3日__________第二轮5_D_2-3__________

文件列表交互器.txt

6tyr_A_002 __________ 6tyr1_B QRT54R AAAAA3erf_1_001 __________ 3erf2_B质量6R XXXXX

输出.txt

6tyr_A_002 __________ 6tyr1_B QRT54R AAAAA7年2月_009日__________3erf_1_001 __________ 3erf2_B质量6R XXXXX第二轮5_D_2-3__________

我对编程语言不太熟悉。我尝试将函数grep与此脚本一起使用:

grep-f列表.txt列表_交互器.txt

但输出是一个类似文件“listinteractors.txt”的文件。

你能帮我吗?

2
  • 1
    也许你要找的工具是参加,不是格雷普.检查手册页 2020年5月26日8:37
  • 1
    的行为格雷普你看是因为-(f)选择权匹配规则(=过滤规则)。最后,您的命令说“打印所有行list_interactors.txt列表包含中的一个字符串的列表.txt(你的情况是每一个线路输入列表交互器.txt). 2020年5月26日9:13

4个答案4

重置为默认值
12
$join-a 1<(sort list.txt)<(sort-list_interactors.txt)第二轮5_D_2-3__________3erf_1_001 __________ 3erf2_B质量6R XXXXX6tyr_A_002 __________ 6tyr1_B QRT54R AAAAA7年2月_009日__________

这使用参加在两个文件之间执行关系JOIN操作。默认情况下,第一个字段将用作联接键。

这个-a 1个期权使参加输出第一个文件中的所有行,即使第二个文件中没有匹配项(它执行“左连接”)。

输入数据到参加需要进行排序,我们通过调用分类在命令行上进行两次进程替换,分别在每个文件上执行。您还可以选择预先分类文件。

如果数据以制表符分隔,则可能需要添加-t$“\t”到的开始参加命令的参数。这将使输出保留现有的选项卡分隔符。

通过添加重定向输出>输出.txt如果要将其存储在文件中,则返回到命令末尾。

5

如果你想保持排序,你可以使用awk公司:

哎呀'FNR==NR{s[1]=$0}FNR=NR{如果(s[$1])打印s[$1];否则打印$0}'list_interactors.txt列表.txt

输出:

6tyr_A_002 __________ 6tyr1_B QRT54R AAAAA2009年2月7日__________3erf_1_001 __________ 3erf2_B质量6R XXXXX第二轮5_D_2-3__________
1
$awk'NR==FNR{a[$1]=$0;next}{print($1 in a?a[$1]:$0)}'list_interactors.txt list.txt6tyr_A_002 __________ 6tyr1_B QRT54R AAAAA7年2月_009日__________3erf_1_001 __________ 3erf2_B质量6R XXXXX第二轮5_D_2-3__________
1

Perl一行程序还可以执行以下操作:

$perl-ane'{chomp;$s{$F[0]}=$_;}结束{打印“$s{$_}\n”进行排序(键(%s))}'list.txt list_interactors.txt第2天D_2-3__________3erf_1_001 __________ 3erf2_B质量6R XXXXX6tyr_A_002 __________ 6tyr1_B QRT54R AAAAA2009年2月7日__________

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.