2015-09-19 57 views
1

我在下面顯示爲樣本拖文件:如何定值添加到逗號分隔的列表中AWK

col1  col2  col3 col4 col5     col6 
247828 313574 55,126,184 25 4734,163,133,81,130 0,6637,8368,9333,14005 

,我需要在COL1的值與每個元素COL6使輸出看起來象:

col1  col2  col3 col4 col5     col6 
247828 313574 55,126,184 25 4734,163,133,81,130 247828,254465,256196,257161,261833 

我嘗試使用

awk -F "\t" 'BEGIN{OFS="\t"}{array[arraylen++]=$6;for (i =0; i < arraylen; i++) print array[i]; }1' 

我猜IM某處丟失,它打印的6個元素我n col6。有人可以幫助解決問題。

回答

0
$ awk 'NR>1 { 
     split($6,a,/,/) 
     new="" 
     for (i=1;i in a;i++) { 
      new = new (i>1?",":"") a[i]+$1 
     } 
     sub(/[^[:space:]]+$/,new) 
    } 1' file 
col1  col2  col3 col4 col5     col6 
247828 313574 55,126,184 25 4734,163,133,81,130 247828,254465,256196,257161,261833 

請注意,上面將保留您原來在輸入文件中的字段之間有空白區域。

0

你可以去這樣的事情:

$ cat file 
247828 313574 55,126,184  25  4734,163,133,81,130  0,6637,8368,9333,14005 
$ awk -v OFS='\t' '{ n = split($6, a, ","); 
    s = ""; 
    for (i=1; i<=n; ++i) s = s a[i]+$1 (i<n?",":""); 
    $6 = s; 
} 1' file 
247828 313574 55,126,184  25  4734,163,133,81,130  247828,254465,256196,257161,261833 

設置輸出字段分隔符製表符(輸入一個並不需要從默認的變化)。將第6個字段拆分爲數組a。循環訪問數組以建立第6個字段的新值。

正如評論(謝謝)中所建議的,而不是重複分配到$6,我已經使用了一個臨時變量s。這意味着記錄只能寫入一次,這對性能更好。

+0

我確定你知道如果字段之間不是空格,而是另外考慮性能 - awk會在每次給'$ 6賦值時重新編譯當前記錄,我們會爲每個記錄做6次,每次記錄的價值爲6美元,就像當前的樣本輸入一樣。如果文件很大,那麼這可能會有明顯的影響,因爲分配給一個變量,然後在最後執行'$ 6 = var',這樣記錄只會重新編譯一次。 –

+1

我認爲輸入中的字段被製表符分隔,因爲OP會將'FS'設置爲問題中的製表符。關於表現的公平點,我編輯了我的答案。 –

+0

是的,你可能是對的,儘管通過閱讀一個腳本並不這樣做,試圖猜測一個腳本應該做什麼,總是有點冒險:-)。特別是 - 發佈的輸入文件沒有每行上的列的起始點彼此左對齊,只是看看它們之間的分離量,那麼「col5」和「col6」在第一行,所以它看起來不像一個製表符分隔的文件給我,但idk。 –