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