awk解析字段并包含1个管道的文本

时间:2015-11-07 14:53:08

标签: awk

我正在尝试解析awk中的输入以包含|gc= in $4,但我无法做到。以下是关闭:

到目前为止

awk

awk '{sub(/\|[^[:blank:]]+[[:blank:]]+[0-9]+/, ""); print }' input.txt

输入

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

当前输出

chr1    955543  955763  AGRN-6  +
chr1    957571  957852  AGRN-7  +
chr1    970621  970740  AGRN-8  +

所需输出(每个字段由标签分隔)

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

修改

gawk '{gensub(/\|[^[:blank:]]+[[:blank:]]+[0-9]+[\]+/, ""); print }' input.txt > output.txt
gawk: cmd. line:1: {gensub(/\|[^[:blank:]]+[[:blank:]]+[0-9]+[\]+/, ""); print }
gawk: cmd. line:1:          ^ unterminated regexp
gawk: cmd. line:1: error: Unmatched [ or [^: /\|[^[:blank:]]+[[:blank:]]+[0-9]+[\]+/, ""); print }/

还尝试了这个awk,但只打印原始输入:

awk '{sub(/\|[^[:blank:]]+[[:blank:]]+[0-9]+[[|blank|]]+/, ""); print }' input.txt > output.txt

4 个答案:

答案 0 :(得分:1)

这很接近:(不包括|,但没什么大不了的)

awk '{split($4,a,"|"); print $1,$2,$3,a[1],a[3],$6}' input.txt
chr1    955543  955763  AGRN-6 gc=75    +
chr1    957571  957852  AGRN-7 gc=61.2  +
chr1    970621  970740  AGRN-8 gc=57.1  +

谢谢你@shelter:)

答案 1 :(得分:1)

awk -F'|' '{sub(/ 0 /,"")}{print $1"|"$3}' file
chr1    955543  955763  AGRN-6|gc=75    +
chr1    957571  957852  AGRN-7|gc=61.2  +
chr1    970621  970740  AGRN-8|gc=57.1  +

首先,管道用作现场分隔符。关键是要摆脱第二列。它由一个没有任何逗号的管道替换,以便将第一列和第三列紧密地保持在一起。这样做的零点仍然在加号旁边。因此,在打印操作之前,必须删除零,在这种情况下,通过子和图案来移除零,以便不将它们全部移除。我用/ space0space /。

答案 2 :(得分:1)

你总是可以尝试多个阶段,每个阶段非常简单并使用awk的内置

$ awk -F'|' '{print $1"|"$3}' file 
    | awk -v OFS="\t" '{print $1,$2,$3,$4,$6}' 

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

答案 3 :(得分:0)

awk 'BEGIN{FS="[ ]+|[|]+"};{print $1,$2,$3"|"$6 }' 

编辑:使用gawk

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