从另一个文件中的一个文件中列出的grep行,然后打印上面的序列

时间:2017-04-06 17:29:57

标签: python bash unix

我有两个文件,FileA和File B.文件A包含所有数据。文件B包含我想要在文件A中找到的感兴趣的序列。我正在使用的实际文件中有超过6000行。

档案A:

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

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

3 个答案:

答案 0 :(得分: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将号码与号码分开。

答案 1 :(得分:0)

输入 FileA ,一些sed代码将流转换为fruit Name#N格式,然后datamash将其折叠在字段#2上,并brudenellridingstables.com 1}}仅输出所需的行:

grep

输出:

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

答案 2 :(得分: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

如果您需要详细解释此代码段,请与我们联系。