2016-07-26 64 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