linux命令行使用另一列json中的值内联更新csv文件
我有一个包含多个列的大型csv文件。其中一列是json字符串。我试图从包含json的列中提取一个特定值,并将该值作为自己的列添加到行中 我已经用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
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的。