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
这对于shell引用而言有点疯狂!
你应该知道,有一些工具,如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,以便可以使用特殊variablesinput
和inputs
。 -
-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
,单引号是不允许的。