我有大约65000个产品代码在一个文本文件。我想分裂这些数字在999组每一个。然后,后希望每个999号单引号逗号分隔。你能建议我如何通过Unix脚本实现上述场景吗?
87453454 65778445 . . . .
直至x1月1x日需要按以下模式排列:
'87453454','65778445',
bwntbbo31#
使用awk:
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
sed " :a \$bb N 0~999{ :b s/\n/','/g s/^/'/ s/$/'/ b } ba" file
mhd8tkvw2#
awk ' { printf "\47%s\47,", $0 } ++c == 999 { print "" c = 0 } END { if (c) print "" }'
cyej8jka3#
使用Perl:
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
i7uaboj44#
65000并没有awk的那么多行-只需一次性完成所有操作:
65000
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
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',/
'
',
-n
H
(This还添加了一个换行符作为分隔符,但我们稍后将其删除)。
0~999
$
z;x;...;p
同时删除前面提到的所有分隔符换行符(s/\n//g)。
s/\n//g
5条答案
按热度按时间bwntbbo31#
使用
awk
:或者,使用GNU
sed
:mhd8tkvw2#
使用awk:
cyej8jka3#
使用
Perl
:Credit for Mauke perl@libera.chat
i7uaboj44#
65000
并没有awk
的那么多行-只需一次性完成所有操作:这是用于将它们全部组合在一行中。要生成999个1,请尝试
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
_==$NF
检查最右列是否为空,rn0zuynd5#
如果您的输入文件只包含示例中所示的短代码,则可以使用以下方法:
或者,可以使用以下
sed
命令:s/(.*)/'\1',/
将每一行 Package 在'
...',
中-n
)H
将修改的行附加到所谓的 hold 空间;基本上是存储单个字符串的帮助器变量。(This还添加了一个换行符作为分隔符,但我们稍后将其删除)。
0~999
)和输入文件末尾($
)...z;x;...;p
)同时删除前面提到的所有分隔符换行符(
s/\n//g
)。