我正在尝试解析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
答案 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