在另一个选项卡分隔文件中grep文本文件的每一行

时间:2016-07-02 15:43:43

标签: regex bash awk grep

我有一个文本文件1,其中包含一些ID:

  c10013_g2_i1|m.63|vomeronasal type-1 receptor 4-like  
  c10015_g1_i1|m.409|vomeronasal type-1 receptor 1-like

我使用grep '^[^|]*' file1从file1中提取|之前的字符串。

我希望每个greped字符串与另一个文件2中的行匹配,并在匹配时返回整行。 file2看起来像这样:

  c10013_g2_i1  781 622.2   73  5.95    5.16  
  c10014_g1_i1  213 58.67   3   2.59    2.25  
  c10014_g2_i1  341 182.35  4   1.11    0.96  
  c10015_g1_i1  404 245.23  16  3.31    2.87  
  c10017_g1_i1  263 105.37  6   2.89    2.5 

最后结果如下:

c10013_g2_i1|m.63|vomeronasal type-1 receptor 4-like 781    622.2   73  5.95    5.16  
c10015_g1_i1|m.409|vomeronasal type-1 receptor 1-like 404   245.23  16  3.31    2.87

3 个答案:

答案 0 :(得分:2)

您可以使用awk

awk 'FNR == NR {
   split($0, a, /[|]/)
   seen[a[1]] = $0
   next
}
$1 in seen {
   $1 = seen[$1]
   print
}' file1 file2

c10013_g2_i1|m.63|vomeronasal type-1 receptor 4-like   781 622.2 73 5.95 5.16
c10015_g1_i1|m.409|vomeronasal type-1 receptor 1-like 404 245.23 16 3.31 2.87

答案 1 :(得分:1)

对于结构化文本,awk是工具之王。

$ awk 'NR==FNR{split($0,v,"|");a[v[1]]=$0; next} 
       $1 in a{k=$1; $1=""; print a[k] $0}' file1 file2  

c10013_g2_i1|m.63|vomeronasal type-1 receptor 4-like   781 622.2 73 5.95 5.16
c10015_g1_i1|m.409|vomeronasal type-1 receptor 1-like 404 245.23 16 3.31 2.87

答案 2 :(得分:-1)

听起来你正试图加入每个文件的第一个字段。实际上有join命令可以执行此操作。您需要稍微更改file1(join适用于空格):

cat file1 | sed 's/^\([^|]*\)[|]/\1 |/' | sort > file1-delimited

然后你可以join他们:

cat file2 | sort | join file1-delimited -

c10013_g2_i1 |m.63|vomeronasal type-1 receptor 4-like  781 622.2 73 5.95 5.16
c10015_g1_i1 |m.409|vomeronasal type-1 receptor 1-like 404 245.23 16 3.31 2.87

这应该可以让你获得95%的方式,但格式可能并不完美。