2017-09-05 74 views
0

假设伊夫一排这样的:AWK打印字作为阵列

LOCUS  NG_052676    31180 bp DNA  linear PRI 08-AUG-2017 

正在由match($0, /LOCUS\s*([^\n]*)/, o)

选择和打印由print o[1]

但这选择/打印整排由于空白:

NG_052676    31180 bp DNA  linear PRI 08-AUG-2017 

如何捕获前两个字符串作为数组o,如此:o [1] = NG_052676和o [2] = 31180?

注:我不想改变FS变量正被用于其他

NB2这是我使用的整个的awk的东西:

BEGIN{RS="//";FS=OFS="|"} 
{ 
    match($0, /LOCUS\s*([^\n]*)/, o) 
    match($0, /\(([^)]+)\)/, a) 
    match($0, /\/gene="([^"]+)"/, b) 
    match($0, /\/product="([^"]+)"/, c) 
    match($0, /\/chromosome="([^"]+)"/, d) 
    match($0, /\/map="([^"]+)"/, e) 
    match($0, /Summary:\s([^\[]+)/, f) 

    print o[1] " ", a[1] " ",b[1] " ", gensub(/\s\s+/, " ", "g1", c[1]) " ", 
    d[1] " ", e[1] " ", 
    gensub(/\s\s+/, " ", "g2", f[1]) 
} 
+1

不确定你认为''g1“'和''g2”'可能意味着gensub()参数,但gawk会将它们都视为'“g”'。该参数可以是要匹配的正则表达式匹配的数字,也可以是匹配所有匹配的“g”。 –

+1

感谢您的更正。当我克隆第一个gensub语句时,我想确保变量g不会与先前的语句冲突(awk非常新) – haz

+1

不客气。你真的应该发布一个新的问题,所以我们可以帮助你引导你正确的道路。例如,所有这些匹配行像'match($ 0,/ \/gene =“([^”] +)“/,b)'应该合并成一行,如'match($ 0,/ \ ([[:alpha]] +)=“([^”] +)“/,b){f [b [1]] = b [2]}'然后您可以通过它们名字,例如'print f [“gene”],f [“map”]'。 'FS =“|”''是一个不错的选择。 –

回答

1

随着GNU AWK(其中您已经使用)的第三个参数匹配():

$ awk 'match($0, /LOCUS\s+(\S+)\s+(\S+)/, o) { print o[1], o[2] }' file 
NG_052676 31180 
+1

完美,谢谢 – haz

+1

不客气。在脚本的其余部分中,你的方法实际上很奇怪 - 通常当你有名称 - >值映射时,最好简单地创建一个存储这些映射的数组。为每个“名称”创建一堆单独的数组来保存它的值非常麻烦。如果你用简明,可测试的样本输入和期望输出发布一个新问题,我相信有人可以帮助你做任何你想要做的事情。 –

1

由于默认情况下awk使用白色空间作为FS,为什么不考虑最简单的awk格式?

$ f1="LOCUS  NG_052676    31180 bp DNA  linear PRI 08-AUG-2017" 
$ awk '{o[1]=$2;o[2]=$3}{print o[1],o[2]}' <(echo "$f1") 
NG_052676 31180 

您仍然可以使用您正则表达式结合起来:

$ awk '/LOCUS/{o[1]=$2;o[2]=$3;print o[1],o[2]}' <(echo "$f1") 
+0

谢谢乔治,你如何将它与匹配功能结合起来? – haz

+1

@hb为什么你需要与比赛相结合,因为没有它可以完成? –

+0

因为它的一部分功能更复杂 – haz