最初の行がパターンと一致する場合にのみ、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 |

ファイルを処理する

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

行1に「何でも」がない場合は、処理する次のファイルに移動する必要があります。

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

BEGINFILEGNU awkを使用している場合は、次のようにこのテストをブロックに入れることができます。

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

関連情報