Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
Perl 在cshell脚本中,每240行连接一个由不同数字组成的大文件_Perl_Shell_Awk_Sed - Fatal编程技术网

Perl 在cshell脚本中,每240行连接一个由不同数字组成的大文件

Perl 在cshell脚本中,每240行连接一个由不同数字组成的大文件,perl,shell,awk,sed,Perl,Shell,Awk,Sed,我有一个包含5000000行和3列的大文件,我想每240行合并一次 我尝试在cshell脚本中使用sed来合并3行:“N;Ns/\n//g'文件名。但是如果我想用它来写240行,我应该写240 n;NNNNn、 …(240次)!解决此问题的最佳方法是什么?给出一个小的测试文件,如 a,b,c d,e,f g,h,i j,k,l m,n,o p,q,r s,t,u v,w,x y,z 更改cnt=?参数以折叠行数。您应该能够毫无问题地使用target 240 awk -v cnt=3 'BEGI

我有一个包含5000000行和3列的大文件,我想每240行合并一次


我尝试在cshell脚本中使用sed来合并3行:“N;Ns/\n//g'文件名。但是如果我想用它来写240行,我应该写240 n;NNNNn、 …(240次)!解决此问题的最佳方法是什么?

给出一个小的测试文件,如

a,b,c
d,e,f
g,h,i
j,k,l
m,n,o
p,q,r
s,t,u
v,w,x
y,z
更改
cnt=?
参数以折叠行数。您应该能够毫无问题地使用target 240

awk -v cnt=3 'BEGIN{i=1}
  {      
      printf $0 ","; i++;
      while (i<=cnt){
        getline
        printf("%s%s", $0 ,(i!=cnt)?",":"")
        i++
      }
      { i=1
        print ""
      }
 }' file
一个小问题是,对于
cnt
的某些值,在列表行的末尾将有额外的
s,即

awk -v cnt=4 'BEGIN{i=1}
  {      
      printf $0 ","; i++;
      while (i<=cnt){
        getline
        printf("%s%s", $0 ,(i!=cnt)?",":"")
        i++
      }
      { i=1
        print ""
      }
 }' file
您可以通过添加

 awk .... file | sed '$/s/,*$//' > outFile
到流程的末尾


大概是这样的,它从每一行中删除换行符,然后根据需要打印出空格或换行符

perl -ne's/\s*\z//; print $_, eof || $. % 240 == 0 ? "\n" : " "' myfile

如果我理解正确的话

paste -d, $(printf "%0.s- " {1..240})
他做这项工作。假定字段分隔符为

演示:

生成一些测试文件

seq -f '%g,a,b' 2400 >demo_file
它包含以下行:

1,a,b
2,a,b
3,a,b
4,a,b
...
2398,a,b
2399,a,b
2400,a,b
命令

paste -d, $(printf "%0.s- " {1..240}) < demo_file | head -2

编辑:刚刚注意到“cshell”。。。不幸的是,以上是针对
bash
,请使用perl解决方案

awk
救援

$ awk 'ORS=NR%240?FS:RS' filename
比如说

$ seq 10 99 | awk 'ORS=NR%10?FS:RS'   

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
解释

ORS=NR%10?FS:RS
这里,如果行号可被10整除,则三元运算符将输出记录分隔符设置为记录分隔符(换行符)或字段分隔符(空格)。有效地在每十条记录后添加一行,并在中间留出空间

这可能适用于您(GNU-sed):


这会一直追加行,直到模式空间包含240行,然后用空格替换所有换行符。

这里有什么理由不使用较短的
$。%240 ? “”:“\n”
而不是
$。%240 == 0 ? “\n”:“
?@jm666:比较起来可读性更好,而且它的
(eof | |$.%240==0)
不能明显缩短
我尝试在cshell脚本中使用sed来合并3行
-我从哪里开始:-)?shell不用于文本操作(请参阅),cshell不用于脚本编写(google“csh why not”),sed只用于对单个行进行简单的替换,例如,它的
N
命令在20世纪70年代中期awk发明时就已过时。你太离谱了。发布一小部分示例输入和预期输出,有人会帮助您。我可以麻烦您添加一个关于
awk
命令工作原理的解释吗?
1,a,b,2,a,b,3,a,b,4,a,b,5,a,b,6,a,b,7,a,b,8,a,b,9,a,b,10,a,b,11,a,b,12,a,b,13,a,b,14,a,b,15,a,b,16,a,b,17,a,b,18,a,b,19,a,b,20,a,b,21,a,b,22,a,b,23,a,b,24,a,b,25,a,b,26,a,b,27,a,b,28,a,b,29,a,b,30,a,b,31,a,b,32,a,b,33,a,b,34,a,b,35,a,b,36,a,b,37,a,b,38,a,b,39,a,b,40,a,b,41,a,b,42,a,b,43,a,b,44,a,b,45,a,b,46,a,b,47,a,b,48,a,b,49,a,b,50,a,b,51,a,b,52,a,b,53,a,b,54,a,b,55,a,b,56,a,b,57,a,b,58,a,b,59,a,b,60,a,b,61,a,b,62,a,b,63,a,b,64,a,b,65,a,b,66,a,b,67,a,b,68,a,b,69,a,b,70,a,b,71,a,b,72,a,b,73,a,b,74,a,b,75,a,b,76,a,b,77,a,b,78,a,b,79,a,b,80,a,b,81,a,b,82,a,b,83,a,b,84,a,b,85,a,b,86,a,b,87,a,b,88,a,b,89,a,b,90,a,b,91,a,b,92,a,b,93,a,b,94,a,b,95,a,b,96,a,b,97,a,b,98,a,b,99,a,b,100,a,b,101,a,b,102,a,b,103,a,b,104,a,b,105,a,b,106,a,b,107,a,b,108,a,b,109,a,b,110,a,b,111,a,b,112,a,b,113,a,b,114,a,b,115,a,b,116,a,b,117,a,b,118,a,b,119,a,b,120,a,b,121,a,b,122,a,b,123,a,b,124,a,b,125,a,b,126,a,b,127,a,b,128,a,b,129,a,b,130,a,b,131,a,b,132,a,b,133,a,b,134,a,b,135,a,b,136,a,b,137,a,b,138,a,b,139,a,b,140,a,b,141,a,b,142,a,b,143,a,b,144,a,b,145,a,b,146,a,b,147,a,b,148,a,b,149,a,b,150,a,b,151,a,b,152,a,b,153,a,b,154,a,b,155,a,b,156,a,b,157,a,b,158,a,b,159,a,b,160,a,b,161,a,b,162,a,b,163,a,b,164,a,b,165,a,b,166,a,b,167,a,b,168,a,b,169,a,b,170,a,b,171,a,b,172,a,b,173,a,b,174,a,b,175,a,b,176,a,b,177,a,b,178,a,b,179,a,b,180,a,b,181,a,b,182,a,b,183,a,b,184,a,b,185,a,b,186,a,b,187,a,b,188,a,b,189,a,b,190,a,b,191,a,b,192,a,b,193,a,b,194,a,b,195,a,b,196,a,b,197,a,b,198,a,b,199,a,b,200,a,b,201,a,b,202,a,b,203,a,b,204,a,b,205,a,b,206,a,b,207,a,b,208,a,b,209,a,b,210,a,b,211,a,b,212,a,b,213,a,b,214,a,b,215,a,b,216,a,b,217,a,b,218,a,b,219,a,b,220,a,b,221,a,b,222,a,b,223,a,b,224,a,b,225,a,b,226,a,b,227,a,b,228,a,b,229,a,b,230,a,b,231,a,b,232,a,b,233,a,b,234,a,b,235,a,b,236,a,b,237,a,b,238,a,b,239,a,b,240,a,b
241,a,b,242,a,b,243,a,b,244,a,b,245,a,b,246,a,b,247,a,b,248,a,b,249,a,b,250,a,b,251,a,b,252,a,b,253,a,b,254,a,b,255,a,b,256,a,b,257,a,b,258,a,b,259,a,b,260,a,b,261,a,b,262,a,b,263,a,b,264,a,b,265,a,b,266,a,b,267,a,b,268,a,b,269,a,b,270,a,b,271,a,b,272,a,b,273,a,b,274,a,b,275,a,b,276,a,b,277,a,b,278,a,b,279,a,b,280,a,b,281,a,b,282,a,b,283,a,b,284,a,b,285,a,b,286,a,b,287,a,b,288,a,b,289,a,b,290,a,b,291,a,b,292,a,b,293,a,b,294,a,b,295,a,b,296,a,b,297,a,b,298,a,b,299,a,b,300,a,b,301,a,b,302,a,b,303,a,b,304,a,b,305,a,b,306,a,b,307,a,b,308,a,b,309,a,b,310,a,b,311,a,b,312,a,b,313,a,b,314,a,b,315,a,b,316,a,b,317,a,b,318,a,b,319,a,b,320,a,b,321,a,b,322,a,b,323,a,b,324,a,b,325,a,b,326,a,b,327,a,b,328,a,b,329,a,b,330,a,b,331,a,b,332,a,b,333,a,b,334,a,b,335,a,b,336,a,b,337,a,b,338,a,b,339,a,b,340,a,b,341,a,b,342,a,b,343,a,b,344,a,b,345,a,b,346,a,b,347,a,b,348,a,b,349,a,b,350,a,b,351,a,b,352,a,b,353,a,b,354,a,b,355,a,b,356,a,b,357,a,b,358,a,b,359,a,b,360,a,b,361,a,b,362,a,b,363,a,b,364,a,b,365,a,b,366,a,b,367,a,b,368,a,b,369,a,b,370,a,b,371,a,b,372,a,b,373,a,b,374,a,b,375,a,b,376,a,b,377,a,b,378,a,b,379,a,b,380,a,b,381,a,b,382,a,b,383,a,b,384,a,b,385,a,b,386,a,b,387,a,b,388,a,b,389,a,b,390,a,b,391,a,b,392,a,b,393,a,b,394,a,b,395,a,b,396,a,b,397,a,b,398,a,b,399,a,b,400,a,b,401,a,b,402,a,b,403,a,b,404,a,b,405,a,b,406,a,b,407,a,b,408,a,b,409,a,b,410,a,b,411,a,b,412,a,b,413,a,b,414,a,b,415,a,b,416,a,b,417,a,b,418,a,b,419,a,b,420,a,b,421,a,b,422,a,b,423,a,b,424,a,b,425,a,b,426,a,b,427,a,b,428,a,b,429,a,b,430,a,b,431,a,b,432,a,b,433,a,b,434,a,b,435,a,b,436,a,b,437,a,b,438,a,b,439,a,b,440,a,b,441,a,b,442,a,b,443,a,b,444,a,b,445,a,b,446,a,b,447,a,b,448,a,b,449,a,b,450,a,b,451,a,b,452,a,b,453,a,b,454,a,b,455,a,b,456,a,b,457,a,b,458,a,b,459,a,b,460,a,b,461,a,b,462,a,b,463,a,b,464,a,b,465,a,b,466,a,b,467,a,b,468,a,b,469,a,b,470,a,b,471,a,b,472,a,b,473,a,b,474,a,b,475,a,b,476,a,b,477,a,b,478,a,b,479,a,b,480,a,b
$ awk 'ORS=NR%240?FS:RS' filename
$ seq 10 99 | awk 'ORS=NR%10?FS:RS'   

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
sed -r ':a;$!{N;s/[^\n]+/&/240;Ta};s/\n/ /g' file