2015-10-16 46 views
0

尝试使用awk解析文件,但没有获得所需的输出,我似乎无法弄清楚。谢谢 :)。awk解析输入并删除字段中的文本

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 + 

电流output.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 + 

期望output.txt的|pr=2|gc=75 0,和线条之间的空间)从输出除去

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

这是我曾尝试:

awk -F"[*|]" '{print $1, $2, $3, $4, $5, $6,}' input.txt > output.txt 

回答

3

你可以这样做:

awk -F '[[:blank:]]+|\\|' '{print $1, $2, $3, $4, $NF}' 

这就给了你想要的领域,但它不留间隔。这将:

awk '{sub(/\|[^[:blank:]]+[[:blank:]]+[0-9]+/, ""); print }' <<END 
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 + 
END 
chr1 955543 955763 AGRN-6 + 
chr1 957571 957852 AGRN-7 + 
chr1 970621 970740 AGRN-8 + 
1

也许最简单的解决方案:

awk -F"|" '{print $1" +"}' input.txt > output.txt 

在此解决方案,然而,后 “+” 被手动添加。输出:

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

否则,请尝试

awk -F"[| ]+" '{print $1, $2, $3, $4, $8}' input.txt > output.txt 

其输出

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

另一种选择(如果你不介意的输出间距)

$ awk '{split($4,a,"|"); print $1,$2,$3,a[1],$NF}' file 
chr1 955543 955763 AGRN-6 + 
chr1 957571 957852 AGRN-7 + 
chr1 970621 970740 AGRN-8 +