次の形式の巨大な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を処理するには、いずれの場合でもファイル全体を読み取って列数を把握する必要があります(ヘッダーのない列には数値ヘッダーが自動的に割り当てられます)。