我有一个文本文件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
答案 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%的方式,但格式可能并不完美。