unix 将数字拆分并排列为单反转

qq24tv8q  于 2023-01-08  发布在  Unix
关注(0)|答案(5)|浏览(152)

我有大约65000个产品代码在一个文本文件。我想分裂这些数字在999组每一个。然后,后希望每个999号单引号逗号分隔。
你能建议我如何通过Unix脚本实现上述场景吗?

87453454
65778445
.
.
.
.

直至x1月1x日
需要按以下模式排列:

'87453454','65778445',
bwntbbo3

bwntbbo31#

使用awk

awk '
    ++c == 1 { out = "\047" $0 "\047"; next }
             { out = out ",\047" $0 "\047" }
    c == 999 { print out; c = 0 }
    END { if (c) print out }
' file

或者,使用GNU sed

sed "
:a
\$bb
N
0~999{
:b
    s/\n/','/g
    s/^/'/
    s/$/'/
    b
}
ba" file
mhd8tkvw

mhd8tkvw2#

使用awk:

awk '
{
  printf "\47%s\47,", $0
}
++c == 999 {
  print ""
  c = 0
}
END {
  if (c)
    print ""
}'
cyej8jka

cyej8jka3#

使用Perl

perl -ne '
    sub pq { chomp; print "\x27$_\x27" } pq;
    for (1 .. 998) {
        if (defined($_ = <>)) {
            print ",";
            pq
        }
    }
    print "\n"
' < file

Credit for Mauke perl@libera.chat

i7uaboj4

i7uaboj44#

65000并没有awk的那么多行-只需一次性完成所有操作:

mawk 'BEGIN { FS = RS; RS = "^$"; OFS = (_="\47")(",")_

      } gsub(/^|[^0-9]*$/,_, $!(NF = NF))'
'66771756','69562431','22026341','58085790','22563930',
'63801696','24044132','94255986','56451624','46154427'

这是用于将它们全部组合在一行中。要生成999个1,请尝试
一个一个二个一个一个一个三个一个一个一个一个一个四个一个

  • _==$NF检查最右列是否为空,
  • -即是否存在需要修整的后缘分离
rn0zuynd

rn0zuynd5#

如果您的输入文件只包含示例中所示的短代码,则可以使用以下方法:

xargs -L 999 bash -c "printf \'%s\', \"\$@\"; echo" . <inputFile >outputFile

或者,可以使用以下sed命令:

sed -Ene"s/(.*)/'\1',/;H" -e{'0~999','$'}'{z;x;s/\n//g;p}' <inputFile >outputFile
  • s/(.*)/'\1',/将每一行 Package 在'... ',
  • 但不打印它(-n
  • 相反,H将修改的行附加到所谓的 hold 空间;基本上是存储单个字符串的帮助器变量。

(This还添加了一个换行符作为分隔符,但我们稍后将其删除)。

  • 每999行(0~999)和输入文件末尾($)...
  • ...然后打印并清除 hold 空格(z;x;...;p

同时删除前面提到的所有分隔符换行符(s/\n//g)。

相关问题