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

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

我用Excel 2013(在Windows上)从xlsl导出了一个csv文件。 我发邮件给自己新的csv文件,并在Unix(MacOS Sierra)上运行这些testing。

考虑下面的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 )。

有什么build议么?

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

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

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

这对于s​​hell引用而言有点疯狂!

你应该知道,有一些工具,如jq ,它们是为了创build和使用JSON数据而devise的。 如果这不仅仅是一次性的任务,你可能会更好地看待这些。

用Ed Morton的build议来编辑 评论 :

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

(但是从你原来的问题来看,你似乎使用了一个单独的脚本文件,所以你不必担心转义引号。)

正如已经指出的那样,基于“引用'的示例输出不是有效的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 awinput(不是JSON的input)
  • -n禁止自动读取input,以便可以使用特殊variablesinputinputs
  • -c产生紧凑的输出(不漂亮)
  • inputs表示所有input行,并表示|之后的expression式 看到每一行. ,迭代。
  • 输出对象可以使用JavaScript语法来指定,因为属性名称不需要引用,所以可以简化事务。 { ... }的扩展值在输出时被转换为JSON。

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 ,单引号是不允许的。