awk 命令从标题包含特定子字符串的 csv 文件中提取列

Use*_*ser -1 awk text-processing csv

我有一个巨大的 csv 文件,其格式为

aaa1, "aaa2, aa214", aa21, "aa, a14", aa211, aa44, aaa445 
data, data, data, data, data, data, data,
........................................
........................................
Run Code Online (Sandbox Code Playgroud)

我想提取标题包含特定字符串的列,比如说a2. 对于上面的示例,这包括列aaa2等等aa21

我尝试过的 awk 命令是

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

但这只返回匹配的标题,而不返回它们下面的列。请指出我正确的方向。我使用的是Linux系统。

Sté*_*las 6

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
Run Code Online (Sandbox Code Playgroud)

不过,这不会扩展到内存不适合的 CSV。为了--allow-ragged-csv-input应对每行中字段数量与示例中不同的 CSV,在任何情况下都必须完整读取文件,以了解有多少个列(没有标题的列会自动分配数字标题) )。