awk在变量空间分隔符之间打印单词作为数组

时间:2017-09-05 11:51:46

标签: arrays 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?

NB我不想更改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])
} 

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

使用GNU awk(你已经在使用)为第3个arg匹配():

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