Unix 批量grep,但根据第一个输入文件排序结果

Unix 批量grep,但根据第一个输入文件排序结果,unix,grep,Unix,Grep,我有一个文件(称之为fileA),其中一列标识符包含重复项。看起来是这样的: GO:0005515 GO:0005737 GO:0005875 GO:0005884 GO:0005200 GO:0005524 GO:0005737 ... GO:0000001 mitochondrion inheritance GO:0000002 mitochondrial genome maintenance GO:0000003 reproduction GO:0000006

我有一个文件(称之为fileA),其中一列标识符包含重复项。看起来是这样的:

GO:0005515 GO:0005737 GO:0005875 GO:0005884 GO:0005200 GO:0005524 GO:0005737 ... GO:0000001 mitochondrion inheritance GO:0000002 mitochondrial genome maintenance GO:0000003 reproduction GO:0000006 high-affinity zinc uptake transmembrane transporter activity GO:0000007 low-affinity zinc ion transmembrane transporter activity GO:0000009 alpha-1,6-mannosyltransferase activity GO:0000010 trans-hexaprenyltranstransferase activity GO:0000011 vacuole inheritance ... GO:0005515 GO:0005737 GO:0005875 GO:0005884 GO:0005200 GO:0005524 GO:0005737 ... 我有另一个文件(称为fileB),它包含两列,第一列有标识符,另一列有关联的文本。看起来是这样的:

GO:0005515 GO:0005737 GO:0005875 GO:0005884 GO:0005200 GO:0005524 GO:0005737 ... GO:0000001 mitochondrion inheritance GO:0000002 mitochondrial genome maintenance GO:0000003 reproduction GO:0000006 high-affinity zinc uptake transmembrane transporter activity GO:0000007 low-affinity zinc ion transmembrane transporter activity GO:0000009 alpha-1,6-mannosyltransferase activity GO:0000010 trans-hexaprenyltranstransferase activity GO:0000011 vacuole inheritance ... GO:0000001线粒体继承 GO:0000002线粒体基因组维护 GO:0000003复制 GO:0000006高亲和力锌摄取跨膜转运蛋白活性 GO:0000007低亲和力锌离子跨膜转运蛋白活性 GO:0000009α-1,6-甘露糖基转移酶活性 GO:0000010反式己烯基转移酶活性 GO:0000011液泡遗传 ... 我希望使用fileA中的标识符进行grep,以便从fileB中获得具有标识符和描述的匹配行,并以与fileA(而不是fileB)相同的顺序在另一个fileC中输出它,同时保留重复项

我尝试了几种不同的方法:

fgrep -f fileA fileB > fileC fgrep-f fileA fileB>fileC 这不起作用,因为fileC中的顺序是fileB的顺序,而不是fileA

for name in `FileA` do grep "$name" FileB >> FileC done 在'FileA'中的名称` 做 grep“$name”文件B>>文件C 完成 这应该是可行的,但输出是:

GO:0005515 protein binding GO:0005737 cytoplasm GO:0005737 cytoplasm GO:0005737 cytoplasm GO:0005737 cytoplasm GO:0005737 cytoplasm GO:0016301 kinase activity GO:0005525 GTP binding GO:0005737 cytoplasm GO:0016021 integral component of membrane ... GO:0005515蛋白质结合 GO:0005737 GO:0005737 GO:0005737 GO:0005737 GO:0005737 GO:0016301激酶活性 GO:0005525 GTP绑定 GO:0005737 GO:0016021膜的整体组件 ... 它们也不符合文件A的顺序(前两个文件除外)


有什么想法吗?

试试这个awk单行程序,输出应该遵循文件a的顺序

awk 'NR==FNR{b[$1]=$0;next}$1 in b{print b[$1]}' fileB fileA
如果
文件b
中的两列由
分隔,则在
awk
之后添加
-F'\t
,因此:

awk -F'\t' 'NR==FNR......`
添加一个测试
kent$head-fa-fb

==>fa fb在经历了许多挫折之后,结果证明,在本例中,是fileA具有Windows格式(而不是最初认为的fileB)

虽然fileA是在UNIX系统上生成的,但它是由Windows计算机上程序Blast2GO最初生成的文件生成的。这就是为什么它没有早些被捕获的原因

我使用以下命令删除回车符:

sed -i 's/\r$//' fileA sed-i的/\r$/'文件a
…然后是原始帖子中建议的循环和第一个答案中提供的脚本。

不幸的是,这两个循环似乎都按照原始帖子中使用bash脚本观察到的顺序返回,而不是按照文件A的顺序,并且只返回标识符,而不是标识符+描述。@Ekall I添加了一个测试,这些描述与indexNo一样简单。出示订单。检查您是否得到相同的输出。我得到您测试用例的结果,但不是我的用例。我的一个文件,带有标识符和描述的文件,是在Windows机器上准备的,UNIX处理是在UNIX机器上完成的。这可能是问题的一部分吗?有一些像dos2unix这样的工具可以将dos/win格式转换为unix,例如换行符。。。你可以试试@ekall