列名がCSVファイルの特定のパターンに一致する列全体を抽出する方法は?

列名がCSVファイルの特定のパターンに一致する列全体を抽出する方法は?

私はUnixに慣れていない非常に大きなCSVファイルを扱っています。

例は次のとおりです。

ABC1,ABC2,ABC3,DDD,EEE,FFF
1,2,3,4,5,6
1,2,3,4,5,6

で始まるすべての列を抽出する方法はABC

ベストアンサー1

次のawkプログラムはそのトリックを実行します。次のファイルに保存しますextract.awk

#!/bin/awk -f

BEGIN { FS=OFS=","}

FNR==1 {
  for (i=1;i<=NF;i++) {
    if (index($i,startstr)==1) cols[++ncol]=i;
  }
}

{ for (j=1;j<=ncol;j++) printf("%s%s",$(cols[j]),j==ncol?ORS:OFS) }

それから電話してください。

~$ awk -f extract.awk -v startstr="ABC" input.csv
ABC1,ABC2,ABC3
1,2,3
1,2,3

文字列を検索する変数の位置を定義しますstartstr

これにより、まず入力フィールドと出力フィールドの区切り文字がに設定されます,

  • 最初の行(ヘッダー行)は、変数に格納されている検索文字列で始まる列名があることを確認しますstartstr。その場合、列番号がcols「印刷する列」配列に追加されます。
  • 各行(最初の行を含む)に対して保存されているすべての列の値を印刷し、最後の列のcols場合は、フィールド区切り文字またはレコード区切り文字(デフォルトは改行)を印刷します。

実際の検索文字列に正規表現コンテキストに特殊文字が含まれている場合、使用する関数は正規表現ベースの一致ではindex()なく文字通りの文字列一致を実行します。awk正規表現の基本検索を使用する必要がある場合は、以下を変更してください。

if (index($i,startstr)==1) cols[++ncol]=i;

到着

if ($i ~ startstr) cols[++ncol]=i

ただし、その中のすべての文字はstartstr正規表現トークンとして解釈されるため、注意しないと予期しない動作が発生する可能性があります。言及した例startstrの場合^ABC

おすすめ記事