2016-07-26 67 views
2

本的部分替換字符是我在做什麼(我只是想在第四列擺脫了領先的數字)使用AWK GSUB與/ 1,可以與原始字符

cat text.txt | awk 'BEGIN {OFS="\t"} {gsub(/[0-9XY][0-9]?([pq])/,"\1",$4); print}' 

這我輸入

AADDC 4902 3 21q11.3-p11.1 4784 4793 
DEEDA 4023 6 9p21.31|22.3-p22.1 2829 2832 
ZWTEF 3920 10 8q21-q22 5811 5812 

這是我的輸出

AADDC 4902 3 11.3-p11.1 4784 4793 
DEEDA 4023 6 21.31|22.3-p22.1 2829 2832 
ZWTEF 3920 10 21-q22 5811 5812 

但我想這是我的輸出

AADDC 4902 3 q11.3-p11.1 4784 4793 
DEEDA 4023 6 p21.31|22.3-p22.1 2829 2832 
ZWTEF 3920 10 q21-q22 5811 5812 
+0

我不認爲你可以在那裏使用'\ 1'引用。哪個版本的awk?也許你有'gensub()'? – shawnt00

+0

我相信這是gnu awk。我運行了「awk --version GNU Awk 4.1.3,API:1.1(GNU MPFR 3.1.4-p1,GNU MP 6.1.0) Copyright(C)1989,1991-2015 Free Software Foundation。」 – Jacob

回答

3

如果使用GNU awk,您可以使用gensub,不像gsub,支持反向引用:

awk 'BEGIN {OFS="\t"} {$4=gensub(/[0-9XY][0-9]?([pq])/,"\\1",1,$4); print}' text.txt 

幾點說明:

什麼是額外的 「\」 由1:

因爲否則,那將是th ASCII碼1

個e字符爲什麼1個需要被放置在\ 1" 和$ 4之間:

告訴gensub只替換模式的第一次出現。

是否有一個原因,你必須把$ 4 =以及支付$ 4

是的,不像gsubgensub不會修改字段,但返回更新之一。

+0

好的謝謝。什麼是1的額外「\」,爲什麼1需要被放置在\\ 1「和$ 4之間 。 是否有一個原因,你必須把$ 4 =結束以及$ 4)。 – Jacob

+1

答案更新了答案;-) – jlliagre