我有一个CSV,需要将CSV转换为简单的换行符分隔的格式,以供输入另一个脚本中,但遇到一个奇怪的问题。
CSV内容:
"1. ID","2. Height","3. Gender","4. Age"
"<1111111111>","5ft. 10.0in.","M"," 15.0"
"<2222222222>","6ft. 0in.","M"," 22.0"
CLI命令的版本1:
cat source.csv | sed 's/[\"<>]//g' | ~/projects/dp/vendor/jq/1.5/jq --raw-input --compact-output 'split("\n") | .[1:] | map(split(",")) | map({"phone_number":.[0],"opt_in":"yes"}) | .[]'
第1版输出:无
CLI命令的版本2:
cat source.csv | sed 's/[\"<>]//g' | ~/projects/dp/vendor/jq/1.5/jq --raw-input --compact-output 'split("\n") | .[0:] | map(split(",")) | map({"phone_number":.[0],"opt_in":"yes"}) | .[]'
第2版输出:
{"phone_number":"1. ID","opt_in":"yes"}
{"phone_number":"1111111111","opt_in":"yes"}
{"phone_number":"2222222222","opt_in":"yes"}
据我了解,。[1:]告诉JQ仅解析行#1之后的行(用新行分隔),但是行#1将指示引用(能够引用phone_number)。
那么版本1为什么不输出任何内容?
答案 0 :(得分:2)
版本1缺少-s
命令行选项。
跳过标题行的另一种方法是不使用inputs
命令行选项而使用-n
,如下所示。与使用inputs
命令行选项相比,使用-s
的效率也要高得多。
< source.csv sed 's/[\"<>]//g' |
jq -cR 'inputs
| split(",")
| {"phone_number":.[0],"opt_in":"yes"}'
使用jq解析CSV文件充满了潜在的困难。通常,最好使用“ csv2tsv”工具将CSV转换为jq可以轻松处理的TSV。