2015-11-09 63 views
0

下面的awk split似乎在輸出中的$ 4〜後面留下空白,我似乎無法阻止它。什麼是正確的語法?謝謝 :)。awk split carry-over空格

輸入

chr1 955543 955763 + AGRN-6|pr=2|gc=75 
chr1 957571 957852 + AGRN-7|pr=3|gc=61.2 
chr1 970621 970740 + AGRN-8|pr=1|gc=57.1 

電流輸出

chr1 955543 955763 + AGRN-6|gc=75 
chr1 957571 957852 + AGRN-7|gc=61.2 
chr1 970621 970740 + AGRN-8|gc=57.1 

gawk '{print gensub(/(^[^|]+)\|[^|]+([|][^+]+).*/,"\\1\\2","g",$0)}' input 

編輯

chr1^I955543^I955763^I+ AGRN-6|gc=75$ 
chr1^I957571^I957852^I+ AGRN-7|gc=61.2$ 
chr1^I970621^I970740^I+ AGRN-8|gc=57.1$ 

期望

chr1^I955542^I955662^I+^IAGRN_70$ 
chr1^I955643^I955763^I+^IAGRN_71$ 
chr1^I957570^I957690^I+^IAGRN_72$ 
+0

這只是該字段之前的選項卡,而不是原來似乎有的空間不是嗎? –

+0

什麼是編輯和期望應該向我們展示?關於你的輸入的東西?從某個工具輸出? –

+0

@Ed Morton'gawk'命令產生編輯,並且似乎在'$ 4'之後有一個空格。所需的沒有空間,但有一個標籤。謝謝 :)。 – Chris

回答

1

awk將重寫與指定OFS的行。如果您想保留輸入間距可以選擇帶有sed

sed -r 's/\|.*\|/\|/' file 
chr1 955543 955763 + AGRN-6|gc=75 
chr1 957571 957852 + AGRN-7|gc=61.2 
chr1 970621 970740 + AGRN-8|gc=57.1 
1
awk '{n=split($5, a, "|"); print $1,$2,$3,$4" "a[1]"|"a[3]}' OFS="\t" input 
+0

非常感謝大家:)。 – Chris

+0

'sed'命令的輸出似乎在'$ 4'之後引入了空格而不是標籤,這是造成問題的原因。我在編輯的原始文章中發佈了輸出。謝謝 :)。 – Chris

+0

@Chris那麼在你的問題中'awk'命令有什麼問題?它似乎是在你需要的地方添加標籤。 – jayant

2

一個簡單的解決方案的另一個好奇awk替代:

awk '{print $1""$2}' FS='pr=[0-9]\\|' file 

結果

chr1 955543 955763 + AGRN-6|gc=75 
chr1 957571 957852 + AGRN-7|gc=61.2 
chr1 970621 970740 + AGRN-8|gc=57.1 

說明

FS的值可以是任何regex,所以我們可以使用pr=[0-9]|作爲分隔符並打印它之前和之後的字段。