2015-02-24 61 views
0

獲得最大的價值我有一個看起來像這樣的製表符分隔的fileA:的bash/awk的:每個細胞

seqnameAa_len_240      seqnameBa_len_247 
seqnameAb_len_881      seqnameBb_len_719 
seqnameAc_len_736,seqnameAd_len_640 seqnameBc_len_489 
seqnameAe_len_241      seqnameBd_len_302,seqnameBe_len_465 
seqnameAf_len_436,seqnameAf_len_620 seqnameBf_len_452,seqnameBg_len_435 

序列左邊是從一個數據集和序列從右邊是從另一個。每一行反映了一組相似的序列。在某些情況下,屬於同一序列組的一個,另一個或兩個數據集有多個序列(反映在一列中用逗號分隔的幾個序列中)。

對於每一行,我想找到一種方法來找到兩個數據集中每個數據集的最大值,並給出以下輸出。

240 247 
881 719 
736 489 
241 465 
620 452 

我想過做一個for循環在所有的行,然後對每行以換行符替換逗號,然後刪除所有的文本,並只保留號碼,並選擇每列使用awk的最大值。但是用我現在的bash/awk知識必須按列方式完成,並且每個單元沒有一定數量的逗號分隔條目,我不知道該怎麼做。

是否有一種更簡單的方式從fileA獲取上述輸出?

+3

不要猶豫,嘗試自己編碼並顯示你的嘗試。否則,你很可能會習慣於完成任務,當你需要自己完成任務時,你將不會學到任何東西。 – fedorqui 2015-02-24 15:30:38

回答

1
$ cat tst.awk 
BEGIN { FS=OFS="\t" } 
{ 
    for (fldNr=1; fldNr<=NF; fldNr++) { 
     split($fldNr,fldArr,/,/) 
     for (sfNr=1; sfNr in fldArr; sfNr++) { 
      sub(/.*_/,"",fldArr[sfNr]) 
      max = ((sfNr==1)||(fldArr[sfNr]>max) ? fldArr[sfNr] : max) 
     } 
     $fldNr = max 
    } 
    print 
} 

$ awk -f tst.awk file 
240  247 
881  719 
736  489 
241  465 
620  452 
0
perl -MList::Util=max -lane ' 
    print max($F[0] =~ /\d+/g), "\t", max($F[1] =~ /\d+/g) 
' fileA 
+0

雖然此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – msrd0 2015-02-24 19:44:03

0

我會使用一些弄虛作假GAWK,實現這一目標而無需手動分裂:

gawk -F , -v RS='[\t\n]' '{ m = 0; for(i = 1; i <= NF; ++i) { sub(/.*_/, "", $i); if($i > m) { m = $i } } printf m RT }' 

的技巧是使用製表符和換行符作爲記錄分隔符,這樣記錄不再是一個線,但否則會是一個字段(例如seqnameAf_len_436,seqnameAf_len_620),並且字段$1,$2等是由逗號分隔的子字段(因爲-F ,)。然後

{ 
    m = 0 
    for(i = 1; i <= NF; ++i) { # walk through the (comma-delimited) fields 
    sub(/.*_/, "", $i)  # isolate the number 
    if($i > m) {    # find the maximum 
     m = $i 
    } 
    } 
    printf m RT    # and print it with the same record terminator 
          # that was in the input (tab or newline) 
} 

無論是使用正則表達式作爲記錄分隔符和RT是gawk的特異性。