Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 每次选择20条记录,并从一个大文件中转置_Loops_Unix_Awk_Sed - Fatal编程技术网

Loops 每次选择20条记录,并从一个大文件中转置

Loops 每次选择20条记录,并从一个大文件中转置,loops,unix,awk,sed,Loops,Unix,Awk,Sed,我有一个1列80万行的大文件 例如: 123 234 ... 5677 222 444 我想把它转换成每行20个数字 例如: 123,234,.... 5677, 222, 444,.... 我试着像这样使用while循环 while [ $(wc -l < list.dat) -ge 1 ] do cat list.dat | head -20 | awk -vORS=, '{ print $1 }'| sed 's/,$/\n/' >> sample1.

我有一个1列80万行的大文件

例如:

123

234

...

5677

222

444
我想把它转换成每行20个数字

例如:

123,234,....

5677,
222,
444,....
我试着像这样使用while循环

while [ $(wc -l < list.dat) -ge 1 ]

do

cat list.dat | head -20 | awk -vORS=, '{ print $1 }'| sed 's/,$/\n/' >> sample1.dat

sed -i -e '1,20d' list.dat

done
while[$(wc-l>sample1.dat
sed-i-e'1,20d'list.dat
完成
但这速度太慢了


有人能提出更快的解决方案吗?

pr
是实现这一点的合适工具,例如:

$ seq 100 | pr -20ats,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60
61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
对于您的文件,请尝试
pr-20ats,list.dat


根据列文本的宽度,您可能会遇到错误
pr:page width too show
。在这种情况下,请尝试:

$ seq 100000 100100 | pr -40ats,
pr: page width too narrow

$ seq 100000 100100 | pr -J -W79 -40ats,
100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039
100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079
100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100
-W
值的公式是
(col-1)*len(分隔符)+col
,其中
col
是所需的列数

man-pr

pr-转换文本文件以进行打印

-a、 --对面 跨列而不是向下打印列,与-COLUMN一起使用

-t、 --省略标题
省略页眉和拖尾;暗示如果页面长度如果您不希望使用任何其他外部二进制文件,您可以参考下面的SO链接,深入回答类似问题


如果要使用sed:

sed -n '21~20 { x; s/^\n//; s/\n/, /g; p;}; 21~20! H;' list.dat
第一命令

21~20 { x; s/^\n//; s/\n/, /g; p;},
在匹配21+(n*20)的行触发;n> =0。在这里,通过第二个命令在补码行中放入保持空间的所有内容:

21~20! H;
正在处理:

x;
将保持缓冲区(20行)的内容放入模式空间,并将当前行(21+(n*20))放入保持缓冲区。在模式空间中:

s/^\n//
删除尾随的新行并执行以下操作:

s/\n/, /g
是否需要所需的替换:

p;
打印现在有20列的行。 之后,在保持缓冲区中读取下一行,并继续该过程