2017-03-17 64 views
2

我有成千上万个由空白分隔的列。我想做类似从文件打印n列到n列

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中的一个很好的单线程。

+1

@Ed莫顿Ø天哪你是对的。我会解决这个问题。 – badner

回答

5

如果每个字段之间有一个空格,然后cut是这个职位的合适的工具:

cut -d' ' -f 2-3,6-9 file 
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 
+1

我将更改标题以使其不那么独占awk。谢谢你的解释 – badner