2017-04-06 56 views
0

我有两个文件,FileA和文件B.文件A包含所有的数据。文件B包含我想要在文件A中找到的感兴趣的序列。我正在使用的实际文件中有超过6000行。grep行从另一个文件中列出一个文件,然后打印上面的序列

文件:

Name1 
Apples 
Name2 
Pears 
Name3 
Pears 
Name4 
Grapes 
Name5  
Apples 

文件B:

Apples  
Pears 

我想写一个UNIX命令或Python脚本,让我只打印感兴趣的序列上方的线。

我已经使用这个命令尝试:

grep -B 1 -f FileB FileA | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }' 

,但我得到了下面的列表中没有任何方式的名称为苹果和梨

Name1 
Name5  
Name2 
Name3 

我想什么来区分是一样的东西这个:

Apples  
Name1  
Name5  
Pears 
Name2  
Name3  

然后我需要这个列表成为这样的东西:

Apples >Name 1, Name 5 
Pear > Name 2, Name 3 

我对编程非常陌生,任何建议都会很棒!

+1

您可能想要更改您的问题:命令的grep部分工作正常。这是'awk'命令不符合你的期望。事实上,看看你想要什么样的最终输出,我甚至不会用'grep'或'awk'来打扰,我会直接去Python和它的[fileinput](https://docs.python)。 org/3/library/fileinput.html)库。 – user2926055

+0

在** awk **脚本中,您只是忽略了打印触发打印的水果名称。至于Python,你还没有做任何尝试,所以我们无法帮助你处理你的代码。 – Prune

+0

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [在主题](http://stackoverflow.com/help/on-topic)和[如何提问](http://stackoverflow.com/help/how-to-ask)适用于此处。 StackOverflow不是一个设计,编码,研究或教程服务。 – Prune

回答

0

输入FILEA,一些sed代码变换流成fruit Name#N格式,然后datamash崩溃它字段#2,和一个grep只输出所需的行:

sed -n 'h;n;G;s/\n/ /p' < FileA | datamash -W -s -g1 collapse 2 | grep -f FileB 

输出:

Apples Name1,Name5 
Pears Name2,Name3 
+0

谢谢,这真的很有帮助。我不得不改变命令,因为它打印了一半的名字,因为它们之间有空格,但是这很好用!谢谢! – Ellie

+0

@Ellie,请看看:[接受答案:它是如何工作的?](https://meta.stackexchange.com/a/5235/334345)我还注意到OP数据中的尾部空格,但不确定这些人是否属于原始数据,因此在回答之前删除了这些空间。很高兴它解决了。 – agc

0
cat B.txt | xargs -III sh -c \ 
       'echo II "\> "; grep II A.txt -B1 | grep -v "\-\-" | grep -v II ' 

做这项工作。

苹果

名1

NAME5

名称2

NAME3

之后,您可以使用sed将姓名与号码分开。

0

因为它似乎你已经熟悉的awk,为什么不尝试对整个工作的简单awk的片段:

$ awk 'NR==FNR{a[$1]=(!a[$1]?prev:a[$1]", "prev);prev=$1;next}$1 in a{print $1" > "a[$1]}' fileA fileB 
Apples > Name1, Name5 
Pears > Name2, Name3 

让我知道你是否需要详细解释这段代码。