2017-03-17 14 views
2

空白で区切られた何千もの列があります。私は似たようなことをしたいと思っていますファイルからbashの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モートンOおやっ、あなたが正しいです。私はこれを解決します。 – badner

答えて

5

各フィールドの間に1つのスペースがある場合は、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

関連する問題