【问题标题】:Bash - how to convert lines into a single line of quoted valuesBash - 如何将行转换为单行引用值
【发布时间】:2020-12-22 23:20:22
【问题描述】:

给定上一个命令返回的值列表:

ABC-55080
ABC-55060
ABC-55040
ABC-55035
ABC-55030
ABC-55025
ABC-55020

我想得到一个引用值的单行列表:

("ABC-55060", "ABC-55040", "ABC-55035", "ABC-55030", "ABC-55025", "ABC-55020")

我尝试过使用 awk 来做到这一点:

cat input_list.csv | awk '{print}' ORS='", "'

但我得到的是没有开头和结尾引号的列表:

ABC-55060", "ABC-55040", "ABC-55035", "ABC-55030", "ABC-55025", "ABC-55020

如何做到这一点?

【问题讨论】:

  • 这可能会有所帮助:awk '{$1=$1; print "(\"" $0 "\")"}' OFS='", "' RS='' file
  • 或者这个:awk 'BEGIN{printf "(\""} $1=$1; END{printf "\")"}' OFS='", "' RS='' file

标签: bash awk replace


【解决方案1】:

您能否尝试在 GNU awk 中使用所示示例进行跟踪、编写和测试。在链接中编写和测试 https://ideone.com/zO1eYf

awk '
BEGIN{
  s1="\""
  OFS=", "
}
FNR>1{
  val=(val?val OFS:"")s1 $0 s1
}
END{
  print "(" val ")"
}
' Input_file

解释:BEGIN部分变量s1的设置值为",这里设置输出字段分隔符为, 。然后如果行大于1,则进入主程序块检查条件,然后继续将该行的值添加到变量val,并用s1包装它的值。在此程序的END 块中打印val 的值,分别在val 值之前和之后添加()

【讨论】:

    【解决方案2】:

    当你想使用sed时:

    sed 's/.*/"&",/;1s/^/(/;$s/,$/)/' input_list.csv  | tr -d "\n" 
    

    当你的 inputfile 被用作例子并且你实际上想要处理一个流的输出时,你可以使用

    cat input_list.csv | xargs -I"{}" printf '"%s", ' "{}" | sed 's/^/(/; s/, $/)\n/'
    

    【讨论】:

      【解决方案3】:
      $ awk '{o=o s "\""$0"\""; s=", "} END{print "(" o ")"}' file
      ("ABC-55080", "ABC-55060", "ABC-55040", "ABC-55035", "ABC-55030", "ABC-55025", "ABC-55020")
      

      【讨论】:

        【解决方案4】:

        如果ed 可用/可接受。

        #!/bin/sh
        
        ed -s input_list.csv <<-'EOF'
            g/./s/^/"/\
            s/$/", /
            1,$j
            s/^/(/
            s/,[[:space:]]$/)/
            ,p
            Q
        EOF
        
        • 如果您想就地编辑文件,请将 Q 更改为 w

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-23
          • 1970-01-01
          相关资源
          最近更新 更多