2014-10-30 35 views
0

我需要幫助來改進我的工作代碼,以便根據指定列的相同值組合多個行。 下面是一個示例數據:根據相同列組合多個列值

c-i1_pos-at1-v2 162a AT1G01040.1 2 3422-3443 3433 1 
c-i1_pos-at1-v2 162b AT1G01040.1 2 3422-3443 3433 1 
pare-i_226-v2-wt 162a AT1G01040.1 2 3422-3443 3433 0 
pare-i_226-v2-wt 162b AT1G01040.1 2 3422-3443 3433 0 
xrn4-pare-i_ath-227-v2-wt 827 AT1G02860.1 1 258-278 269 1 
i2_lib2-v2 156a AT1G03730.1 4 242-260 252 3 
i2_lib2-v2 156b AT1G03730.1 4 242-260 252 3 
i2_lib2-v2 156c AT1G03730.1 4 242-260 252 3 
i2_lib2-v2 156d AT1G03730.1 4 242-260 252 3 
i2_lib2-v2 156e AT1G03730.1 4 242-260 252 3 

基本上,如果在列中的值$ 3,$ 5相同,我想的行列的合併等結合$ 2,$ 6(或更多),而其餘的列的唯一值這樣的:

AT1G01040.1 3422-3443 3433 162a,162b 
AT1G02860.1 258-278 269 827 
AT1G03730.1 242-260 252 156a,156b,156c,156d,156e 

現在我想這樣做在多個步驟的基礎上,答案here

awk 'BEGIN{FS=OFS="\t"} {c=$2 FS $3 FS $5; if (c in a) a[c]=a[c]","$6; else a[c]=$6}END{for (k in a) print k,a[k]}'|awk '{p=$1 FS $2 FS $4; if (p in l) l[p]=l[p]","$3;else l[p]=$3}END{for (m in l) print m,l[m]}' <input.txt 

其中給出:

AT1G01040.1 3422-3443 3433,3433 162a,162b 
AT1G02860.1 258-278 269 827 
AT1G03730.1 242-260 252 156a,156b,156c,156d,156e 

我想我應該把其餘列的值作爲陣列在一步得到我想要的輸出,但我在努力找出正確的上下文。

+0

理想情況下,第1行應該只有一個3433,但是我在那裏的代碼打印3433兩次..必須是因爲我搞砸了一些東西:/ – psaima 2014-10-30 09:40:54

+0

是的,它完美的作品 - 非常感謝!現在我正在通過代碼來了解正確的上下文 - 再次感謝。 – psaima 2014-10-30 09:54:06

+0

這將是偉大的:) – psaima 2014-10-30 09:57:23

回答

2

如何像

awk '{if ($3 in a) a[$3] = a[$3]","$2; else a[$3] = $3" "$5" "$6" "$2} END{for (i in a) print a[i]}' inputFile 

會產生輸出作爲

AT1G03730.1 242-260 252 156a,156b,156c,156d,156e 
AT1G02860.1 258-278 269 827 
AT1G01040.1 3422-3443 3433 162a,162b,162a,162b 

說明

a[$3] = $3" "$5" "$6" "$2創建由第三字段$3索引的數組a,所述else部分確保了數組在行是e時創建第一次沒有問題。

if ($3 in a) a[$3] = a[$3]","$2如果第三字段$3是陣列中已經存在,附加字段中的兩個$2到陣列

END{for (i in a) print a[i]}END塊在輸入結束時excecuted。打印整個數組給輸出

編輯

一個簡單的版本將是

awk '{($3 in a) ? a[$3] = a[$3]","$2 : a[$3] = $3" "$5" "$6" "$2} END{for (i in a) print a[i]}' inputFile 

謝謝Jotne的意見。

+2

你的代碼的一些打高爾夫:'awk'{a [$ 3] =($ 3 in a)?a [$ 3]「,」$ 2:$ 3FS $ 5FS $ 6FS $ 2} END {for我在a)打印一份[i]}'文件' – Jotne 2014-10-30 11:14:39

+0

不客氣。您也可以刪除括號,但這會讓閱讀變得更加困難,所以最好將其留在那裏。 – Jotne 2014-10-30 11:23:40

+0

@Jotne OP剛開始使用awk,我們不想讓他更難:) – nu11p01n73R 2014-10-30 11:25:51

相關問題