我有一个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行将指定引用(能够引用phone_number)。
那么,为什么第1版没有输出任何内容呢?
发布于 2018-09-24 18:39:34
版本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转换为TSV,jq可以轻松处理。
https://stackoverflow.com/questions/52485114
复制相似问题