我有一個來自 eggnog mapper 的注釋表,需要制作這個 KO 表:
Gene evalue KO
Gene1 0.00003 KO0000
Gene2 0.00005 KO0001
Gene2 0.00005 KO0003
Gene3 0.000005 KO0002
這是我的表(test.txt):
Gene evalue KO
Gene1 0.00003 KO0000
Gene2 0.00005 KO0001,KO0003
Gene3 0.000005 KO0002
我有 ~17,000 行,輸出為 xlsx 格式。我遇到的第一個問題是,當我將輸出檔案另存為 txt 并在 linux ( head test.txt) 中查看時,某些列如下所示:
Gene,evalue,KO
Gene1 0.00003 KO0000
Gene2 0.0005 "KO0001,KO0003"
Gene3 0.00005 KO0002
如何洗掉這些值周圍的引號?以及如何制作上面的注釋表?
我已經從這個執行緒嘗試過這個腳本(如何將逗號分隔值拆分為多行?)
awk '?BEGIN { OFS="\t" }
{ $1=$1;t=$0; }
{ while(index($0,",")) {
gsub(/,[[:alnum:],]*/,""); print;
$0=t; gsub(OFS "[[:alnum:]]*,",OFS); t=$0;
}
print t
}' file
但由于第三列中值的引號,它似乎陷入了無限回圈。
謝謝
uj5u.com熱心網友回復:
我無法使用您的awk代碼重現您的“無限回圈”問題。(事實上??,代碼根本沒有產生任何輸出)。這是一個替代awk解決方案:
awk 'BEGIN{OFS="\t"} \
NR==1{gsub(",",OFS,$0); print} \
(NR>1 && $0 ~ /,/) {gsub("\"","",$3); split($3,a,","); $3=""; for (i in a) {print $0 a[i]}} \
(NR>1 && $3!=""){print $0}' input.txt
輸出:
Gene evalue KO
Gene1 0.00003 KO0000
Gene2 0.0005 KO0003
Gene2 0.0005 KO0001
Gene3 0.00005 KO0002
要更準確地匹配您預期的輸出格式,請將awk輸出通過管道傳輸到column -t:
awk 'BEGIN{OFS="\t"} \
NR==1{gsub(",",OFS,$0); print} \
(NR>1 && $0 ~ /,/) {gsub("\"","",$3); split($3,a,","); $3=""; for (i in a) {print $0 a[i]}} \
(NR>1 && $3!=""){print $0}' tt.txt | column -t
輸出:
Gene evalue KO
Gene1 0.00003 KO0000
Gene2 0.0005 KO0003
Gene2 0.0005 KO0001
Gene3 0.00005 KO0002
uj5u.com熱心網友回復:
如果您的資料始終是這樣的結構,并且多個值在用逗號分隔的雙引號之間,您可以使用FPAT來定義欄位的內容gnu awk
欄位的內容由模式決定:
"[^"]*"|[^[:space:],]
該模式匹配"..."除逗號之外的 OR 1 非空白字符。
然后您可以列印前 2 個欄位,并為第三個欄位檢查是否有逗號。如果有,則模式的第一部分與雙引號匹配,因為它是唯一可以包含逗號的部分。
然后,您可以拆分"或,使用字符類。列印拆分回傳的所有值,并丟棄回圈中的第一個和最后一個條目,因為它們是由雙引號引起的。
awk -v OFS="\t" -v FPAT='"[^"]*"|[^[:space:],] ' '
{
start = $1 OFS $2
if (index($3, ",")) {
n=split($3, a,/[,"]/)
for(i=2;i<n;i ) print start OFS a[i]
next
}
print start OFS $3
}
' file
輸出
Gene evalue KO
Gene1 0.00003 KO0000
Gene2 0.0005 KO0001
Gene2 0.0005 KO0003
Gene3 0.00005 KO0002
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/524800.html
標籤:重击awk
