cmd.awkに次のコードがあります。
BEGIN {FS=","}
{
if(FNR==1) print $0",Header";
else if (FNR>1)
{
if($79==0 && $80==0 && $81==0) print $0",0";
else if ($80==0 && $81!=0) print $0","($79-$81)/$81;
else if ($81==0 && $80!=0) print $0","($79-$80)/$80;
else if ($81==0 && $80==0 && $79!=0) print $0",10";
else if ($81!=0 && $80!=0) print $0","(($79-$80)/$80)+(($80-$81)/$81);
}
}
次のコマンドを実行すると:
awk -f cmd.awk input.txt
(AWKスクリプトで指定されているように)必要な操作を実行し、必要な結果を提供します。
ただし、このスクリプトでは、入力txtファイルのすべての列がcolumn_indexに基づいてアクセスされています。つまり、$ 79、$ 80、$ 81などです。
私の要件は、このスクリプトを、$ 79、$ 80、$ 81とHeader(スクリプトで指定)をパラメーターとして受け取り、操作を実行し、結果を列名Headerで新しく追加された列に格納し、新しいを格納する関数として使用する必要があることです。内容を出力ファイルに。ただし、パラメータは列ヘッダーの形式でのみ指定でき、列インデックスでは指定できません。つまり、関数呼び出しは次のようにする必要があります。
cmd(column_header1, column_header2, column_header3,new_header)
cmd()の関数定義は、上記のawkスクリプトで説明されている操作を実行する必要があります。
これを行う方法はありますか?私はawkを初めて使用することを覚えておいてください。前もって感謝します。
入力ファイルには、150列と5,000万行を超える行が含まれています。ファイルのサンプルを以下に示します。
RN,DATE,ID,PRE_M1,PRE_M2,GALV,GALG,PRE_M5.........................TOTAL
0624873840,2016/04/28,201610,1618,0,0,0,Active,.................12234
0747269250,2016/02/02,201610,227,93,0,0,Daat,....................99988
入力ファイルには、numeric、characterタイプの列が含まれています。上記のAWKスクリプトでアクセスされている列は、すべて数値型です。
必要な出力ファイルのサンプルは次のとおりです。
RN,DATE,ID,PRE_M1,PRE_M2,GALV,GALG,PRE_M5.........................TOTAL,Header
0624873840,2016/04/28,201610,1618,0,0,0,Active,.................12234,10
0747269250,2016/02/02,201610,227,93,0,0,Daat,....................99988,0
「Header」という名前のファイルに新しい列が追加されており、この列には、入力ファイルの個々の行ごとのAWKスクリプトの結果が含まれていることに注意してください。
私はあなたがそれをかなり単純化できると思います、入力ファイルがないので盲目的に飛んでいます...
対象の列が連続していて、フィールドがすべて数値であると仮定して、開始アドレスを入力するだけです
$ awk -F, -v s=79 'BEGIN {OFS=FS}
NR==1 {$(NF+1)="Header"}
NR >1 {v1=$s; v2=$(s+1); v3=$(s+2)
if(!v2 && !v3) $(NF+1) = v1?10:0
else $(NF+1) = v3?(v1-v3)/v3:0 + v2?(v1-v2)/v2:0}1' file
パラメトリック列名は、次のように記述できます。
$ cols="c1,c2,c3"; header="Header"
$ awk -F, -v cols="$cols" -v hdr="$header" '
BEGIN {OFS=FS}
NR==1 {n=split(cols,cn);
for(i=1;i<=NF;i++)
for(j=1;j<=n;j++)
if($i==cn[j]) c[++k]=i;
$(NF+1)=hdr}
NR >1 {v1=$c[1]; v2=$c[2]; v3=$c[3]
if(!v2 && !v3) $(NF+1) = v1?10:0
else $(NF+1) = v3?(v1-v3)/v3:0 + v2?(v1-v2)/v2:0}1' file
id,c1,c2,c3,Header
1,0,0,0,0
2,0,0,1,-1
3,0,1,0,-1
4,0,1,1,-1
5,1,0,0,10
6,1,0,1,0
7,1,1,0,0
8,1,1,1,0
指定された入力ファイルに対して
id,c1,c2,c3
1,0,0,0
2,0,0,1
3,0,1,0
4,0,1,1
5,1,0,0
6,1,0,1
7,1,1,0
8,1,1,1
説明
n=split(cols,cn)
同じFS区切り文字を使用して、文字列「cols」を配列「cn」に分割します。要素の数が返され、「n」に割り当てられます。
1
の省略形です {print}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加