ヘッダーに特定の部分文字列を含むcsvファイルから列を抽出するawkコマンド

ヘッダーに特定の部分文字列を含むcsvファイルから列を抽出するawkコマンド

次の形式の巨大なCSVファイルがあります。

aaa1, "aaa2, aa214", aa21, "aa, a14", aa211, aa44, aaa445 
data, data, data, data, data, data, data,
........................................
........................................

ヘッダーに特定の文字列(たとえば)を含む列を抽出したいと思いますa2。上記の例では、列aaa2などが含まれていますaa21

私が試したawkコマンドは次のとおりです。

awk --csv 'NR==1 {for (i=1; i<=NF; i++) if ($i ~ /a2/) print $i}' file.csv 

ただし、これは一致するヘッダーのみを返し、その下の列は返しません。正しい方向を教えてください。私はLinuxシステムを使用しています。

ベストアンサー1

mlrこの偽のCSV形式は実際にサポートされており、正規表現に基づいてフィールドを切り取ることができます。

$ mlr --csv --csv-trim-leading-space --allow-ragged-csv-input cut -rf a2 your-file.csv
"aaa2, aa214",aa21,aa211
data,data,data

ただし、これはメモリに収まらないCSVには拡張されません。--allow-ragged-csv-input例と行ごとのフィールド数が異なるCSVを処理するには、いずれの場合でもファイル全体を読み取って列数を把握する必要があります(ヘッダーのない列には数値ヘッダーが自動的に割り当てられます)。

おすすめ記事