列のヘッダーに基づくファイルからのAWK参照列

ザイール

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スクリプトの結果が含まれていることに注意してください。

karakfa

私はあなたがそれをかなり単純化できると思います、入力ファイルがないので盲目的に飛んでいます...

対象の列が連続していて、フィールドがすべて数値であると仮定して、開始アドレスを入力するだけです

$ 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]

編集
0

コメントを追加

0

関連記事

分類Dev

awk w / oヘッダーの名前部分文字列の数値ソートに基づいてファイルを連結します

分類Dev

元のファイルの列ヘッダーに基づいてファイルを個別のファイルに分割する方法は?

分類Dev

ヘッダーに基づくPythonコピーファイル

分類Dev

3列の値に基づくcsvファイルのAwk合計行

分類Dev

ヘッダー機能に基づいてファイル列を抽出する

分類Dev

matlabまたはRの2番目のファイルから選択されたヘッダーに基づいてファイルから列を抽出します

分類Dev

列ヘッダー文字列に基づくパンダDataFrame列の条件付きフォーマット

分類Dev

列テキストファイルから別のファイルにヘッダーを追加する

分類Dev

ファイルごとに2列に基づく2ファイルからの共通行

分類Dev

CSVファイルを取得し、列ヘッダーに基づいて個別のファイルに分割する必要があります[JAVA]

分類Dev

CSVファイルを取得し、列ヘッダーに基づいて個別のファイルに分割する必要があります[JAVA]

分類Dev

正規表現に一致するヘッダーに基づいてファイルから列をフィルタリングする

分類Dev

Python:CSVファイルの列ヘッダーへのルックアップに基づいてクラスの変数を設定する方法

分類Dev

fastaファイルのヘッダーから特定の文字列を解析する

分類Dev

文字列からのインクルードロジックに基づくconditionalPanel()

分類Dev

別の配列からの値に基づくTypescriptフィルター配列

分類Dev

bashを使用してコンマ区切りファイルから列ヘッダーに基づいて値を抽出します

分類Dev

VBA:列ヘッダーに基づくオフセット

分類Dev

特定の基準に基づいて、いくつかの名前を別のファイルから配列にコピーしたい

分類Dev

複数の列の一致に基づくファイルのマージ

分類Dev

ファイルをエクスポートし、1つの列に基づいて2つのヘッダーを作成します

分類Dev

フィールド値に基づくファイルへのawkリダイレクトの仕組み

分類Dev

マルチFASTAファイルでAWKを使用して、コンティグヘッダーに基づいて新しい列を追加します

分類Dev

csvヘッダー(列)に基づいてデータを2つ以上のcsvファイルに分割する方法

分類Dev

ヘッダー行を無視して、列内の一致に基づいて2つのCSVファイルを結合します

分類Dev

別のヘッダーファイルのヘッダーファイルからtypedef列挙型をインクルードする

分類Dev

行IDに基づく特定の列ヘッダーの行データ

分類Dev

ヘッダーの値に基づく列の条件付き書式

分類Dev

元のCSVファイルから列0と列2のヘッダーを書き込む方法は?

Related 関連記事

  1. 1

    awk w / oヘッダーの名前部分文字列の数値ソートに基づいてファイルを連結します

  2. 2

    元のファイルの列ヘッダーに基づいてファイルを個別のファイルに分割する方法は?

  3. 3

    ヘッダーに基づくPythonコピーファイル

  4. 4

    3列の値に基づくcsvファイルのAwk合計行

  5. 5

    ヘッダー機能に基づいてファイル列を抽出する

  6. 6

    matlabまたはRの2番目のファイルから選択されたヘッダーに基づいてファイルから列を抽出します

  7. 7

    列ヘッダー文字列に基づくパンダDataFrame列の条件付きフォーマット

  8. 8

    列テキストファイルから別のファイルにヘッダーを追加する

  9. 9

    ファイルごとに2列に基づく2ファイルからの共通行

  10. 10

    CSVファイルを取得し、列ヘッダーに基づいて個別のファイルに分割する必要があります[JAVA]

  11. 11

    CSVファイルを取得し、列ヘッダーに基づいて個別のファイルに分割する必要があります[JAVA]

  12. 12

    正規表現に一致するヘッダーに基づいてファイルから列をフィルタリングする

  13. 13

    Python:CSVファイルの列ヘッダーへのルックアップに基づいてクラスの変数を設定する方法

  14. 14

    fastaファイルのヘッダーから特定の文字列を解析する

  15. 15

    文字列からのインクルードロジックに基づくconditionalPanel()

  16. 16

    別の配列からの値に基づくTypescriptフィルター配列

  17. 17

    bashを使用してコンマ区切りファイルから列ヘッダーに基づいて値を抽出します

  18. 18

    VBA:列ヘッダーに基づくオフセット

  19. 19

    特定の基準に基づいて、いくつかの名前を別のファイルから配列にコピーしたい

  20. 20

    複数の列の一致に基づくファイルのマージ

  21. 21

    ファイルをエクスポートし、1つの列に基づいて2つのヘッダーを作成します

  22. 22

    フィールド値に基づくファイルへのawkリダイレクトの仕組み

  23. 23

    マルチFASTAファイルでAWKを使用して、コンティグヘッダーに基づいて新しい列を追加します

  24. 24

    csvヘッダー(列)に基づいてデータを2つ以上のcsvファイルに分割する方法

  25. 25

    ヘッダー行を無視して、列内の一致に基づいて2つのCSVファイルを結合します

  26. 26

    別のヘッダーファイルのヘッダーファイルからtypedef列挙型をインクルードする

  27. 27

    行IDに基づく特定の列ヘッダーの行データ

  28. 28

    ヘッダーの値に基づく列の条件付き書式

  29. 29

    元のCSVファイルから列0と列2のヘッダーを書き込む方法は?

ホットタグ

アーカイブ