2017-09-05 44 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