2016-06-19 16 views
0

私は単純なawkスクリプトをデータセットファイルに適用しようとしています。 ファイルには150個の列があり、20から30までの列が必要です。以下AWKを使用してデータセットから特定の列を抽出します

は、私は私が次の行にある10個の各フィールド値を取得する理由を知らない20

30にコード

BEGIN{} 
{ 
for(f=20;f<=30;f++){ 
    print $f; 
    } 
} 

間のフィールドを持つレコードを取得するために使用するスクリプトです。ある

サンプルデータセットの下

1 2 3 4 5 6 7 
2 2 3 4 5 6 7 
3 3 3 4 5 6 7 
4 4 4 4 5 6 7 
5 5 5 5 5 6 7 
6 6 6 6 6 6 7 
7 7 7 7 7 7 7 

I get output as 
1 
2 
3 
4 
5 
6 
7 
2 
2 
3 
4 
5 
6 
7 
...so on 
+0

を*で出力を生成するためにprint文を使用しますシンプルで標準化された書式設定。カンマで区切られたリストで、印刷する文字列または数字だけを指定します。 * – melpomene

+1

メルポメーンのコメントを拡張するには、['printf'](https://www.gnu.org/software/gawk/manual/html_node/Printing)を見てください。 html#Printing)文 –

+0

私はすでにprintf( "%s"、$ f)を使ってみましたが、すべてが一行になっています。どのように列とレコードを持っているのですか?私はOFS、FS、RSも使用しました。しかし、私はそれを働かせることはできません:/ –

答えて

2

は同じ

awk -v f=20 -v t=30 '{for(i=f;i<=t;i++) \ 
        printf("%s%s",$i,(i==t)?"\n":OFS)}' file 

ノートを行うための別の方法である

  1. ftは、それぞれ最初と最後の列です。
  2. 3項演算子を使用して、必要な列間のフィールド区切りを制御しました。

編集

あなたは30と最後の列スルー列20が必要な場合は、以下で十分でしょう:

awk -v f=20 -v t=30 '{for(i=f;i<=t;i++) \ 
         printf("%s%s",$i,(i==t)?OFS""$NF"\n":OFS)}' file 
+0

col 20〜30とlast col(すなわち150th)が必要な場合はどうなりますか?何が最善のアプローチであるかを教えてください。 –

+0

@MurlidharFichadia:アップデートを参照 – sjsam

+0

総数フィールドのためにああ、真のNFの砂。最後の列になります。ニース:)最初の%sプリント列20〜30、2番目の%sは$ NFを表示します。 "%s [スペース]%s"のようなものを追加したにもかかわらず、各列の後ろにスペースを追加する方法はありますか? –

2

ソリューション

BEGIN{FS=" ";} 
{ 
for(f=20;f<=30;f++){ 
    printf("%s ",$f); 
    }print ""; 
} 
関連する問題