从文件中打印bash中的n到n列

时间:2017-03-17 17:57:37

标签: bash awk

我有数千个由空格分隔的列。我想做类似

的事情
awk '{print$1" "$2}' file

但是我需要打印一个范围并保持它们之间的空间。

例如,我有一个包含内容的文件:

1.006 2.0101 1.002 3.005 0.0000 4.09873 9.0009 1000.678 15.0 0.9999 11.8
78.003 9.411 0.000 0.003 20000.0100 1.03 9.00029 100.0 0.5 123.9 1.800

我想要打印2-3和6-9列,我会得到:

2.0101 1.002 4.09873 9.0009 1000.678 15.0
9.411 0.000 1.03 9.00029 100.0 0.5

我对其他工具持开放态度,但这似乎是awk中的一个好单行。

2 个答案:

答案 0 :(得分:5)

如果每个字段之间有一个空格,则cut是该作业的正确工具:

cut -d' ' -f 2-3,6-9 file

答案 1 :(得分:1)

实际上cut是正确的工具,当前上下文是处理工作的最佳方式,但如果您需要awk,您可以尝试这样的事情:

$ cat ext_f.awk 
function ext_field(s,e, r,i)
{   if(e > s)
    {
        for(i=s; i<=e; i++)r = i > s ? r OFS $i : $i;
    }else{
        if(s!="")return $s
    }
    return r
}
{ print ext_field(2,3), ext_field(6,9) }

执行:

输入:

$ cat file
1.006 2.0101 1.002 3.005 0.0000 4.09873 9.0009 1000.678 15.0 0.9999 11.8
78.003 9.411 0.000 0.003 20000.0100 1.03 9.00029 100.0 0.5 123.9 1.800

输出:

$ awk -f ext_f.awk file
2.0101 1.002 4.09873 9.0009 1000.678 15.0
9.411 0.000 1.03 9.00029 100.0 0.5

假设您需要逗号或其他字符作为输出分隔符,则可以修改-v OFS=,如下所示

$ awk -v OFS="," -f ext_f.awk file
2.0101,1.002,4.09873,9.0009,1000.678,15.0
9.411,0.000,1.03,9.00029,100.0,0.5

如果您有gawk,则只需从ext_f.awk删除以下行,然后使用--source选项

    { print ext_field(2,3), ext_field(6,9) }

示例:

$ awk -v OFS="," -f ext_f.awk --source '{print ext_field(1,2)}' file
1.006,2.0101
78.003,9.411