【问题标题】:Converting a list to double quoted comma separated strings将列表转换为双引号逗号分隔的字符串
【发布时间】:2014-07-22 10:26:13
【问题描述】:

我有一个问题,我似乎无法自己解决,也无法通过搜索互联网。

我有一个列表,存储在一个文件中,如下所示:

apple
banana
pineapple

我希望每个字符串都用双引号括起来,并用逗号分隔,如下所示:

"apple","banana","pineapple"

理想情况下,列表的最后一个单词后面不应有逗号,但这不是强制性的。

这背后的想法是能够创建一个 JSON 格式的文档,该文档由存储在纯文本文件中的项目列表填充。

非常感谢。

【问题讨论】:

    标签: linux awk sed grep


    【解决方案1】:
    awk -v RS='' -v OFS='","' 'NF { $1 = $1; print "\"" $0 "\"" }' file
    

    输出:

    "apple","banana","pineapple"
    

    【讨论】:

    • 非常感谢!我在这里的另一个线程中尝试了类似的东西,但无法让它工作。您的解决方案完美运行。
    • @Nesousx 我添加了一个小调整,只是为了确保周围确实有字段。不客气:)
    • $1 =$1 是做什么的?
    • @Jidder 有时 $0 不会使用 OFS 更新自身,因此您更改它的一部分可能只是为了激活 Awk 实现中的 changed 标志。
    • 在设置RS='' 时,FS 也被设置为\n,所以你可以删除它:)
    【解决方案2】:

    我认为 Perl 也值得一提:

    perl -lne 'push @a, qq("$_") }{ print join(",", @a)' file
    

    构建一个数组@a,包含每行的值,用双引号括起来。然后在处理完文件后,打印出@a 中所有元素的逗号分隔列表。

    所谓的eskimo greeting }{是用于创建END块的简写,由于-n-p开关的实现方式。

    输出:

    "apple","banana","pineapple"
    

    如果您要查找的是 JSON,您可以使用 encode_json:

    perl -MJSON -lne 'push @a, $_ }{ print encode_json(\@a)' file
    

    这会将数组转换为真正的 JSON 编码列表:

    ["apple","banana","pineapple"]
    

    【讨论】:

    • }{ 是一个有趣的技巧,但为了新手读者的利益,应该澄清一下,这只是 -p 将表达式包装在 { } 中的副作用,而不是某种形式关键字本身
    【解决方案3】:

    你也可以用这个方法:

    sed -r ':loop ; N ; s/\n/,/g ; $s/[^,]+/"&"/g ; t loop' filename
    

    【讨论】:

      【解决方案4】:

      另一个awk

      awk '{printf "\"%s\"",$1}' file | awk '{gsub(/""/,"\",\"")}1'
      "apple","banana","pineapple"
      

      awk '{printf "\"%s\"",$1}' file | sed 's/""/","/g'
      

      【讨论】:

        【解决方案5】:

        没有花哨的东西 awk:

        awk 'x{x=x","}{x=x"\""$1"\""}END{print x}' file
        

        解释版:

        awk '
          out { out = out "," }           # if there is already something in the output string, append a comma to it
              { out = out "\"" $1 "\"" }  # always append the quoted first column of input to the output string
          END { print out }               # finally, print the output string
        ' file
        

        前两行的特殊顺序很重要 - 它可以防止附加最后的逗号。

        【讨论】:

          【解决方案6】:

          sedpaste 解决方案:

          sed -e 's/^\|$/"/g' file | paste -s -d, -
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-02
            • 1970-01-01
            • 2013-02-04
            • 1970-01-01
            • 1970-01-01
            • 2012-09-04
            相关资源
            最近更新 更多