awk拆分携带空白

时间:2015-11-09 18:57:16

标签: awk

下面的awk分割似乎是在输出中的$ 4~之后留下了空格,我似乎无法阻止它。什么是正确的语法?谢谢你:)。

输入

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$

3 个答案:

答案 0 :(得分: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]|作为分隔符,并在其前后打印字段。

答案 1 :(得分:1)

awk '{n=split($5, a, "|"); print $1,$2,$3,$4" "a[1]"|"a[3]}' OFS="\t" input

答案 2 :(得分: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