最初の行がパターンに一致する場合にのみ Awk でファイルを解析する

最初の行がパターンに一致する場合にのみ Awk でファイルを解析する

CSV ファイルのヘッダーを調べ、列が存在する場合はデータ行に進む必要があります。コンテキストとは、データがいつ、何によって発行されたかに応じて、データに列が含まれる場合です。

ビジネス ロジックを共通言語で維持するための「純粋な」Awk ソリューションを期待していますが、これが不可能な場合は、Awk スクリプトに一致するヘッダーを持つファイルを選択的に配信するアプローチに興味があります。

Gawk の最新バージョンを使用することは常に可能です。

編集して疑似コードを追加します:

ヘッダーに列がある場合(NR==1):ファイルの残りの部分を続行し、そうでない場合はファイルの処理を停止します。

答え1

ファイルを一覧表示するには:

試す

awk 'FNR == 1 && $4 == "whatever" { print FILENAME ;}' file1 ... filen |

これにより、4 列目に何かが含まれるすべてのファイルが選択されます。

面白い名前の場合は、引用符を追加するだけです。

awk 'FNR == 1 && $4 == "whatever" { printf "\"s\"\n", FILENAME ;}' file1 ... filen |

1つのファイルを処理する

awk 'NR == 1 && $4 != "whatever" { exit ;}  other patterns { other action;}' file

多くのファイルを処理する

awk 'NR == 1 && $4 != "whatever" { nextfile ;}  other patterns { other action;}' file1 ... filen

これは次のように読める。

  • IF (条件が満たされない場合)NR == 1 && $4 != "whatever"
  • 次にこのファイルをスキップします{ nextfile ;}
  • そうでなければ続行other patterns { other action;}

答え2

すべてのカンマが区切り文字である単純なカンマ区切りファイル (一部の csv ファイルには、フィールド区切り文字として扱われるべきではない引用符で囲まれたカンマが含まれている場合があります) を想定すると、次のコードは、ヘッダーの列が "SOMESTRING" の場合に、ヘッダーを除くすべての行を出力します。

awk -F, '
    FNR==1 {
        for (i=1; i<=NF; i++) 
            if ($i == "SOMESTRING")
                next
        nextfile
    }
    1
' file1 file2 file3 file4

適切な場合は、文字列の比較を部分文字列テストまたは正規表現一致操作に置き換えることができます。

nextfile は POSIX AWK の一部ではありませんが、広く普及しており、少なくとも gawk、nawk (*BSD システムで使用)、mawk、busybox で使用できます。

答え3

awk 'FNR==1 && ! /whatever/ { nextfile } ; ...remainder of awk script here...' list_of_files_to_process

「whatever」が 1 行目にない限り、処理する次のファイルにスキップする必要があります。

nextfileが GNU awk の拡張機能であるかどうか、または他の awk でも使用できるかどうかは覚えていません。mawkマニュアル ページには記載されていませんが、 のマニュアル ページには記載されていますoriginal-awk。重要な場合は、その機能に頼る前に確認してください。

GNU awk を使用している場合は、次のようなブロックにテストを配置することをお勧めしますBEGINFILE

 BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
 ... remainder of awk script here ...

関連情報