Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux命令行使用另一列json中的值内联更新csv文件_Json_Linux_Shell_Csv_Awk - Fatal编程技术网

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

linux命令行使用另一列json中的值内联更新csv文件,json,linux,shell,csv,awk,Json,Linux,Shell,Csv,Awk,我有一个包含多个列的大型csv文件。其中一列是json字符串。我试图从包含json的列中提取一个特定值,并将该值作为自己的列添加到行中 我已经用sed和awk进行了一些修补,试图做到这一点,但实际上我只是在转动我的轮子 我还尝试将其作为内联文件编辑。csv由制表符分隔 我试图在它自己的列中输入的值是destinationdusage 示例行(此处为便于阅读,高度精简): 行的最终结果现在应该在其自己的列中有876543作为值: 2017-03-22 00:00:01 %key%94e90

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

我已经用
sed
awk
进行了一些修补,试图做到这一点,但实际上我只是在转动我的轮子

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

我试图在它自己的列中输入的值是
destinationdusage

示例行(此处为便于阅读,高度精简):

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

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

非常感谢您的任何帮助。

像这样的东西似乎可以胜任这项工作

$ 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
$echo“$a”
2017-03-22 00:00:01%key%94e901fd3ceef351a0ad770e0be91d38 10 3.0.0[{MC_LIVEREPEATER:false},{environment:details},{feature:pushPublishUsage,destinationDusage:876543}false

$echo“$a”| awk'{for(i=1;i类似这样的东西似乎可以完成这项工作

$ 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
$echo“$a”
2017-03-22 00:00:01%key%94e901fd3ceef351a0ad770e0be91d38 10 3.0.0[{MC_LIVEREPEATER:false},{environment:details},{feature:pushPublishUsage,destinationDusage:876543}false

$echo“$a”| awk'{for(i=1;i与GNU awk一起匹配第三个参数():


添加
-i inplace
进行“inplace”编辑,或者像使用任何UNIX工具一样,只需执行
awk'script'文件>tmp和&mv tmp文件即可。

使用GNU awk进行第三个参数匹配()

添加
-i inplace
进行“inplace”编辑,或者像使用任何UNIX工具一样,只需执行
awk'script'文件>tmp和&mv tmp文件即可。

以下是使用

如果文件
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
要在位编辑文件,您可以使用类似于海绵的工具,如本答案中所述:

    • 以下是一个使用

      如果文件
      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
      
      要在位编辑文件,您可以使用类似于海绵的工具,如本答案中所述:


      您要提取的值(即876543)是否在文件的所有记录中的相同位置?可能会将新对象添加到json中,因此不能保证它始终位于相同位置。在这种情况下,您需要搜索“DestinationDusage”,对吗?没错。同时,您可以在问题中添加awk标记,您将得到一些很好的awk建议,以确定您要提取的值(即876543)在您的文件的所有记录中处于相同的位置?可能会将新对象添加到json,因此不能保证它始终处于相同的位置。在这种情况下,您需要搜索“DestinationDusage”,对吗?没错。与此同时,您可以在问题中添加awk标记,您将得到一些很好的awk建议,以确保您应该提到第三个参数到
      match()
      。您应该提到第三个参数到
      match()
      是特定于gawk的。