2015-02-24 47 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的特异性。