linux命令行更新csv文件内联使用来自另一列json的值

时间:2017-03-25 18:41:03

标签: json linux shell csv awk

我有一个包含多个列的大型csv文件。其中一列是json字符串。我试图从包含json的列中提取特定值,并将该值作为它自己的列添加到该行。

我用sedawk做了一点点试图做到这一点,但我真的只是在转动我的车轮

我也尝试将其作为内联文件编辑。 csv是制表符分隔的。

我试图放入自己的列中的值是destinationIDUsage的值

示例行(此处为了可读性而进行了高度修剪):

2017-03-22  00:00:01    %key%94e901fd3ceef351a0ad770e0be91d38   10  3.0.0   [{"MC_LIVEREPEATER":false},{"environment":"details"},{"feature":"pushPublishUsage","destinationIDUsage":876543}]    false

该行的最终结果现在应该在其自己的列中具有876543作为值:

2017-03-22  00:00:01    %key%94e901fd3ceef351a0ad770e0be91d38   10  3.0.0   [{"MC_LIVEREPEATER":false},{"environment":"details"},{"feature":"pushPublishUsage","destinationIDUsage":876543}]    876543  false

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

这样的事情似乎能完成这项任务。

$ echo "$a"
2017-03-22  00:00:01    %key%94e901fd3ceef351a0ad770e0be91d38   10  3.0.0   [{MC_LIVEREPEATER:false},{environment:details},{feature:pushPublishUsage,destinationIDUsage:876543}]    false

$ echo "$a" |awk '{for (i=1;i<=NF;i++) {if ($i~/destinationIDU/) {match($i,/(.*)(destinationIDUsage:)(.*)(})/,f);extra=f[3]}}}{prev=NF;$(NF+1)=$prev;$(NF-1)=extra}1'
2017-03-22 00:00:01 %key%94e901fd3ceef351a0ad770e0be91d38 10 3.0.0 [{MC_LIVEREPEATER:false},{environment:details},{feature:pushPublishUsage,destinationIDUsage:876543}] 876543 false

虽然可能,awk专家会提出不同的建议,也许会更好。

答案 1 :(得分:1)

使用GNU awk为第3个arg匹配():

$ awk 'BEGIN{FS=OFS="\t"} {match($6,/"destinationIDUsage":([0-9]+)/,a); $NF=a[1] OFS $NF}1' file
2017-03-22      00:00:01        %key%94e901fd3ceef351a0ad770e0be91d38   10      3.0.0   [{"MC_LIVEREPEATER":false},{"environment":"details"},{"feature":"pushPublishUsage","destinationIDUsage":876543}]      876543  false

为&#34; inplace&#34;添加-i inplace编辑或只使用任何UNIX工具执行awk 'script' file > tmp && mv tmp file

答案 2 :(得分:0)

以下是使用jq

的解决方案

如果文件filter.jq包含

  split("\n")[]                              # split string into lines
| select(length>0)                           # eliminate blanks
| split("\t")                                # split data rows by tabs
| (.[5] | fromjson | add) as $f              # expand json
| .[:-1] + [$f.destinationIDUsage] + .[-1:]  # add destinationIDUsage column
| @tsv                                       # convert to tab-separated

data包含示例数据,然后是命令

jq -M -R -s -r -f filter.jq data 

将使用附加列

生成输出
2017-03-22  00:00:01    %key%94e901fd3ceef351a0ad770e0be91d38   10  3.0.0   [{"MC_LIVEREPEATER":false},{"environment":"details"},{"feature":"pushPublishUsage","destinationIDUsage":876543}]    876543  false

要编辑文件,您可以使用海绵等工具,如下所示: