问题描述
试图从$3
开始合并所有其他制表符delim列
NC_044998.1 3757 ref ref ref ref ref ref ref ref ref dev
所以输出是
NC_044998.1 3757 refref refref refref refref refdev
使用
awk 'BEGIN {FS = "\t"} {for (i=3; i<=12; i+=2) {gsub(/\t/,"",$i)1;} print $0};' input
但输出与输入相同
解决方法
使用 GNU awk:
awk 'BEGIN {FS=OFS="\t"} { for (i=0; i<5; i++){$(i+3)=$(i*2+3) $(i*2+4)} NF=7; print }' input
输出:
NC_044998.1 3757 refref refref refref refref refdev
这是怎么回事?
- 第3列获取第3列和第4列的内容。
- 第4列获取第5列和第6列的内容。
- 第5列获取第7列和第8列的内容。
- 第6列获取第9列和第10列的内容。
- 第7列获取第11列和第12列的内容。
- 列的输出限于前7列(
NF=7
)。
请参阅:8 Powerful Awk Built-in Variables – FS,OFS,RS,ORS,NR,NF,FILENAME,FNR
,使用gnu awk
,您可以使用正则表达式执行此操作:
awk -F '\t' -v beg=2 '{
s=""
for (i=1; i<=beg; ++i)
s = s $i FS;
print s gensub( /\t+(\S+\t*)/,"\\1","g",substr($0,length(s)+1) )
}' file
NC_044998.1 3757 refref refref refref refref refdev
PS:您可以在此awk命令中将任何其他列位置作为beg
参数