Linux shell脚本:将原始输出(从dict行转换为csv)
谁能帮我把下面的原始输出转换成Linux shell脚本:将原始输出(从dict行转换为csv),linux,shell,awk,sed,Linux,Shell,Awk,Sed,谁能帮我把下面的原始输出转换成csv或键值对 我尝试了awk,sed方法,但问题是。。。数据{}包含2个键值对,有时它只有一个键值对,如第3行所示。(第三行中缺少myID) 试图低于输出 111,United Kingdom 222,Germany ,United Kingdom 444,United Kingdom 555,United Kingdom ,United Kingdom 请帮忙。。提前感谢。这可能适合您(GNU-sed): 从提供的数据来看,此sed解决方案提供了规定的格式,但
csv
或键值对
我尝试了awk
,sed
方法,但问题是。。。数据{}包含2个键值对,有时它只有一个键值对,如第3行所示。(第三行中缺少myID)
试图低于输出
111,United Kingdom
222,Germany
,United Kingdom
444,United Kingdom
555,United Kingdom
,United Kingdom
请帮忙。。提前感谢。这可能适合您(GNU-sed):
从提供的数据来看,此sed解决方案提供了规定的格式,但我认为可能存在未考虑的边缘情况。每当数据中有标记-值对时,最好构建一个数组,将这些标记(又名或键)映射到它们的值,然后您可以按名称打印它们。如果您发现将来的数据中有更多的标记-值对,只需将标记名添加到第一个要拆分的参数()中的字符串中,脚本的其余部分将按原样工作:
$ cat tst.awk
BEGIN {
numTags = split("myID Country",tagList)
for (i in tagList) {
tags[tagList[i]]
}
FS = "\""
OFS = ","
}
{
delete tag2val
for (i=2; i<NF; i++) {
if ( $i in tags ) {
tag2val[$i] = $(i+2)
}
}
for (tagNr=1; tagNr<=numTags; tagNr++) {
tag = tagList[tagNr]
val = tag2val[tag]
printf "%s%s", val, (tagNr<numTags ? OFS : ORS)
}
}
这看起来像是破损的json。你有原始的有效json数据吗?@Shawn-这是从服务器收到的API输出&我在shell脚本中使用
grep
过滤不需要的行。这是我设法获得的输出。您应该使用json感知工具,如jq
,而不是像grep或sed这样的工具。英国的第三行输出来自哪里?请你的问题要么解释要么修正。非常感谢@poton你节省了我的时间,效果很好。
sed 'N;s/\n"Country":/,/;s/ "data":{/\n/;s/"data":{\|"myID"://g;s/ *"Country":/,/g;s/"//g;P;D' file
$ cat tst.awk
BEGIN {
numTags = split("myID Country",tagList)
for (i in tagList) {
tags[tagList[i]]
}
FS = "\""
OFS = ","
}
{
delete tag2val
for (i=2; i<NF; i++) {
if ( $i in tags ) {
tag2val[$i] = $(i+2)
}
}
for (tagNr=1; tagNr<=numTags; tagNr++) {
tag = tagList[tagNr]
val = tag2val[tag]
printf "%s%s", val, (tagNr<numTags ? OFS : ORS)
}
}
$ awk -f tst.awk file
111,United Kingdom
222,Germany
444,United Kingdom
555,United Kingdom
,United Kingdom