2017-10-16 65 views
2

我試圖合併關於每個柱交替行如何將備用行合併到每個後續列?

輸入:

ind1 T G T 
    T T T 
ind2 G G T 
    G T T 

期望輸出:

ind1 TT GT TT 
ind2 GG GT TT 

我試圖這些命令:

sed 'N;s/\n/ /' <input> output 

paste - - <input> output 

但它只合並交替行,但加入整行,不考慮列;例如:

ind1 T G T T T T 

ind2 G G T G T T 

任何想法使用bash或python?

+1

這是一個代表性的例子,還是僅僅是一個例子?特別是,在您的實際投入中,列數是否固定?數據總是單字母'T'還是'G'?領導者總是在「ind」後面跟着一個號碼?這些標籤或空格? – bishop

+0

是一個代表性的例子。列中的數字是固定的;數據總是以單個字母(但不僅是T或G)。領導者可以是任何不一定跟隨字母數量的字符串。分隔符是標籤。 – Jontexas

回答

3

awk來救援!

$ awk 'NR%2 {n=split($0,a); next} 
      {for(i=1;i<n;i++) $i=a[i+1] $i; 
      print a[1],$0}' file 

ind1 TT GT TT 
ind2 GG GT TT 

說明奇數編號的行分成列。合併下一行並打印。偶數行少一個字段,相應地移位和打印。

+0

完美!這正是我正在尋找的, 這是令人難以置信awk是多才多藝的任何情況hahahahaha – Jontexas

1

GNU AWK溶液(您電流輸入):

awk -F'\t' -v FPAT='[^[:space:]]+' 'NF>3{ h=$1; for(i=1;i<=3;i++) a[i]=$(i+1) } 
       NF==3{ print h,a[1]$1,a[2]$2,a[3]$3 }' OFS='\t' file 

輸出:

ind1 TT GT TT 
ind2 GG GT TT 
+0

謝謝@RomanPerekhrest!它非常完美! – Jontexas

2

非awk的解決方案,因爲你問在bash或Python的答案:

cut -f 1-4 -d ' ' in | # the delimiter is a tab here 
    sed 's/^/>/'   | # replace the start of the line with a > 
    while read a b c d # read the fields 
    do if [[ "$a" = '>' ]]      # if > then a second line 
     then printf "$A\t$B$b\t$C$c\t$D$d\t\n" # so stack them 
     else A=${a#'>'}; B=$b; C=$c; D=$d;  # else set for stack later 
     fi 
    done 

如果你想快速處理大量數據,我會使用perl。 或python。

或C.我討厭awk。不要敲它的能力 - 我只是不喜歡它。

+0

感謝Paul Hodges,但問題是它有超過150000個字段,所以它更容易,而不必設置要讀取的字段a-d。 非常感謝您的解釋,我可能會將它用於較小的文件。 – Jontexas

+2

然後,我肯定會*使用Perl,並使用Perl進行代碼編寫,並附帶警告和嚴格的評論。 Perl在生物信息學方面有相當多的歷史。 –

相關問題