使用两种字段分隔符打印列awk

时间:2016-12-13 12:38:54

标签: awk

我想以这样的方式打印以下文件:前六列总是由制表符分隔,其余的(可以是两个或更多)总是按空格分隔。

对于示例文件:

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列开始输入,我想说列的其余部分随着列数的不同而变化。

谢谢!

4 个答案:

答案 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个更改为空格。如果字段已经以制表符分隔,则可以跳过第一个语句。