AWK参数打印不需要的换行符

时间:2017-03-24 18:33:39

标签: excel bash csv awk

  

免责声明:我使用了一个非常简单的例子,认为每个参数都有一些我不知道的隐藏编码。原来我的   格式化是完全错误的。正如@ miken32所说,我应该使用   逗号。我改变了我的格式,它完美无缺。有价值的教训   得知。

我已使用Excel 2013(在Windows上)从csv导出xlsl个文件。我通过电子邮件发送了新的csv文件,并在Unix(MacOS Sierra)上运行这些测试。

考虑以下CSV文件:

John
Adam
Cameron
Jordan

我试图将每一行格式化为:

{'operator':'EQ', 'property':'first_name', 'value':'John'},
{'operator':'EQ', 'property':'first_name', 'value':'Adam'},
{'operator':'EQ', 'property':'first_name', 'value':'Cameron'},
{'operator':'EQ', 'property':'first_name', 'value':'Jordan'}

所以value是唯一在每一行之间改变的参数。

这是我写的awk文件:

BEGIN { }
{
    print "{'operator':'EQ', 'property':'first_name', 'value':'"$0"'},";
}
END { }

但执行此操作后,我得到的输出是:

{'operator':'EQ', 'property':'first_name', 'value':'John
'},
{'operator':'EQ', 'property':'first_name', 'value':'Adam
'},

请注意,在打印出参数($ 0)后,是否会打印换行符?这搞乱了我的JSON格式。我觉得这与excel导出有关(由Save as .csv完成)。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

在awk中,$0代表整行,而$1$2$n代表行中的分隔字段。

提供的示例不是CSV文件,因为没有逗号分隔的任何值。如果是,你可以这样做:

 awk -F, '{print "{'"'"'operator'"'"':'"'"'EQ'"'"', '"'"'property'"'"':'"'"'first_name'"'"', '"'"'value'"'"':'"'"'"$1"'"'"'},"}' foo.txt 

对于shell友好的引用,这有点疯狂!

您应该知道有jq等工具可用于创建和使用JSON数据。如果这不仅仅是一次性任务,那么您可能会更好地服务于此。

使用来自Ed Mortoncomment的建议进行修改:

 awk -F, '{print "{\047operator\047:\047EQ\047, \047property\047:\047first_name\047, \047value\047:\047"$1"\047},"}' foo.txt 

(但是根据您的原始问题,您似乎仍在使用单独的脚本文件,因此您不必担心转义引号。)

答案 1 :(得分:1)

如前所述,基于'的引用的示例输出不是有效的JSON,只能使用"

确保有效的JSON输出是一个很好的理由 使用jq CLI,这不仅使任务更加健壮,而且还简化了它:

jq -Rnc 'inputs | { operator: "EQ", property: "first_name", value: . }' <<EOF
John
Adam
Cameron
Jordan
EOF

的产率:

{"operator":"EQ","property":"first_name","value":"John"}    
{"operator":"EQ","property":"first_name","value":"Adam"}
{"operator":"EQ","property":"first_name","value":"Cameron"}
{"operator":"EQ","property":"first_name","value":"Jordan"}

说明:

  • -R读取 R aw输入(输入不是JSON)
  • -n会禁止自动读取输入,因此可以使用特殊变量inputinputs
  • -c生成 c ompact输出(不是漂亮打印)
  • inputs代表所有输入行,|之后的表达式迭代地将每一行视为.
  • 可以使用JavaScript语法指定输出对象,这简化了问题,因为属性名称不需要引用; { ... }的扩展值在输出时转换为JSON。

答案 2 :(得分:0)

的Perl:

perl -MJSON -nlE 'push @p,{operator=>"EQ",property=>"first_name",value=>$_}}{say JSON->new->pretty->encode(\@p)' file

输出有效,印刷精美的JSON:

[
   {
      "operator" : "EQ",
      "property" : "first_name",
      "value" : "John"
   },
   {
      "operator" : "EQ",
      "value" : "Adam",
      "property" : "first_name"
   },
   {
      "operator" : "EQ",
      "property" : "first_name",
      "value" : "Cameron"
   },
   {
      "property" : "first_name",
      "value" : "Jordan",
      "operator" : "EQ"
   }
]

更多可读:

perl -MJSON -nlE '
        push @p, { operator=>"EQ", property=>"first_name", value=>$_}
        END {
                say JSON->new->pretty->encode(\@p)
        }' file

如果您生成JSON,最后一点:在JSON中,不允许使用单引号。