【问题标题】:Terminal command equivalent of PHP implode when combining lines组合行时相当于 PHP implode 的终端命令
【发布时间】:2017-03-10 21:17:03
【问题描述】:

我有几行,想把这行分成 5 行,然后为 MySQL IN () 查询内爆。

到此为止我已经成功了

awk '{ printf "%s", $0; if (NR % 5 == 0) print ""; else printf " " }

例如,我想要下面的这些行

1
2
3
4
5
6

成为

1,2,3,4,5
6

如果我用这个

awk '{ printf "%s", $0; if (NR % 5 == 0) print ""; else printf "," }

如果所有行都不能被 5 整除,则输出的尾行将有 ,

更新

以前的标题是 awk 而不是 bash,但事实证明有比 awk 更简单的解决方案。我的目标是做这样的事情

$seq 12 | pr -7ats, | xargs -I X echo "SELECT * FROM Table IN (X)" #or execute mysql
SELECT * FROM Table WHERE id IN (1,2,3,4,5,6,7)
SELECT * FROM Table WHERE id IN (8,9,10,11,12)

【问题讨论】:

    标签: bash awk terminal


    【解决方案1】:

    pr 是这个工具

    $ seq 6 | pr -5ats,
    1,2,3,4,5
    6
    
    $ seq 18 | pr -5ats, 
    1,2,3,4,5
    6,7,8,9,10
    11,12,13,14,15
    16,17,18
    

    【讨论】:

    • 虽然我最初是为awk 发帖的,但这个更适合我的需要。非常感谢!
    【解决方案2】:
    #!/usr/bin/awk -f
    {
      a[NR] = $0
    }
    END {
      for (b in a) {
        printf a[b] (b % 5 && b != NR ? "," : RS)
      }
    }
    

    或者一个班轮:

    awk '{a[NR]=$0} END {for (b in a) printf a[b] (b%5 && b!=NR ? "," : RS)}'
    

    【讨论】:

      【解决方案3】:
      seq 16 |awk '{printf NR%5 ? (NR % 5 ==1 ? $0 : ","$0) : ","$0"\n";}'
      #output:
      1,2,3,4,5
      6,7,8,9,10
      11,12,13,14,15
      16
      

      【讨论】:

      • 这不会发出尾随换行符
      • 对不起,你能举个例子吗?
      【解决方案4】:

      虽然不是单个进程awk 命令,你甚至可以像这样使用pastesed 组合:

      $ cat file 
      1
      2
      3
      4
      5
      6
      $ paste - - - - - -d , < file | sed 's/,\+$//'
      1,2,3,4,5
      6
      $ seq 1 12 > file 
      $ cat file 
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      $ paste - - - - - -d , < file | sed 's/,\+$//'
      1,2,3,4,5
      6,7,8,9,10
      11,12
      

      【讨论】:

        【解决方案5】:

        你可以这样做:

        awk 'NR%5==0{print s","$0; s=""; next} {if (length(s)>0){ s=s","$0 } else s=$0} END {print s}'
        

        测试一下:

        $ seq 1 6 | awk 'NR%5==0{print s","$0; s=""; next} {if (length(s)>0){ s=s","$0 } else s=$0} END {print s}'
        1,2,3,4,5
        6
        $ seq 1 12 | awk 'NR%5==0{print s","$0; s=""; next} {if (length(s)>0){ s=s","$0 } else s=$0} END {print s}'
        1,2,3,4,5
        6,7,8,9,10
        11,12
        

        【讨论】:

          猜你喜欢
          • 2011-02-13
          • 2013-05-22
          • 1970-01-01
          • 2012-05-22
          • 2014-03-11
          • 1970-01-01
          • 2015-11-04
          • 2019-12-22
          • 1970-01-01
          相关资源
          最近更新 更多