我想以这样的方式打印以下文件:前六列总是由制表符分隔,其余的(可以是两个或更多)总是按空格分隔。
对于示例文件:
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
我通过输入以下内容来实现此目的:
awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7" "$8" "$9" "$10}' file
但是,不是从第7列开始输入,我想说列的其余部分随着列数的不同而变化。
谢谢!
答案 0 :(得分:0)
您可以使用for
遍历字段。
{
for (i=1; i<=NF; i++) {
if (i<7) {
ORS="\t"
} else if (i != NF) {
ORS=" "
} else {
ORS="\n"
}
print $i
}
}
示例强>
$ awk -f prog.awk file
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
答案 1 :(得分:0)
{
r = $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t";
for (i=7; i<=NF; i++) {
r = r $i " ";
}
print substr(r,1,length(r)-1)
}
您的代码适用于静态数量的字段。
NF变量包含当前记录的总字段数。 因此,您可以在for循环中使用它来动态连接字段。
此外,在循环的末尾有一个剩余空间,由substr。
删除答案 2 :(得分:0)
这是真正做到的:
$ awk '{$1=$1; for(i=1;i<=6;i++) sub(/ /,"\t")}1' file
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
$1=$1
重新编译当前记录,用一个空白字符(OFS)替换所有连续空格(FS)序列,sub()
只是用一个标签替换该行上的第一个空白,并且循环重复sub()
6次。
答案 3 :(得分:0)
使用GNU sed
$ sed -r 's/ +/\t/g; s/\t/ /7g' file
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
首先将字段分隔符转换为制表符,然后从第7个更改为空格。如果字段已经以制表符分隔,则可以跳过第一个语句。