Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.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
Bash AWK按分隔符和计数分割文件_Bash_Unix_Awk - Fatal编程技术网

Bash AWK按分隔符和计数分割文件

Bash AWK按分隔符和计数分割文件,bash,unix,awk,Bash,Unix,Awk,我有一个220mb的大文件。该文件按水平行“--”分组。这就是我到目前为止所做的: cat test.list | awk -v ORS="" -v RS="-------------------------------------------------------------------------------" '{print $0;}' 我如何将其打印到每1000个匹配项的新文件中 还有别的办法吗?我查看了split和csplit,但“---”行不会以可预测的方式出现,所以我必

我有一个220mb的大文件。该文件按水平行“--”分组。这就是我到目前为止所做的:

    cat test.list | awk -v ORS="" -v RS="-------------------------------------------------------------------------------" '{print $0;}'
我如何将其打印到每1000个匹配项的新文件中

还有别的办法吗?我查看了split和csplit,但“---”行不会以可预测的方式出现,所以我必须对它们进行匹配,然后根据匹配数进行拆分


我希望将输出文件分成每个文件1000个匹配项的组。

未测试,但以下内容可能会起作用:

awk 'BEGIN {fileno=1,matchcount=0}
     /^-------/ { if (++matchcount == 1000) { ++fileno; matchcount=0; } }
                { print $0 > "output_file_" fileno }' < test.list
awk'开始{fileno=1,matchcount=0}
/^-------/{如果(++matchcount==1000){++fileno;matchcount=0;}
{print$0>“output_file_u”fileno}'

把所有这些都放进去,比如说
split.awk
,然后使用
awk-f split.awk test.list
,可能会更干净一些,因为没有测试过…

,但是沿着这些思路可能会起作用:

awk 'BEGIN {fileno=1,matchcount=0}
     /^-------/ { if (++matchcount == 1000) { ++fileno; matchcount=0; } }
                { print $0 > "output_file_" fileno }' < test.list
awk'开始{fileno=1,matchcount=0}
/^-------/{如果(++matchcount==1000){++fileno;matchcount=0;}
{print$0>“output_file_u”fileno}'

将所有这些都放进去,比如说
split.awk
,然后使用
awk-f split.awk test.list
,而不是…

将前1000条记录输出到
outputfile0
,然后是
outputfile1
,只需执行以下操作:

awk 'NR%1000 == 1{ file = "outputfile" i++ } { print > file }' ORS= RS=------ test.list
(注意,为了简单起见,我截断了RS中的破折号。)

不幸的是,使用大于一个字符的
RS
值会产生未指定的结果,因此上述方法无法解决问题。也许需要类似于特瓦尔伯格的解决方案:

awk '/^----$/ { if(!(c%1000)) count+=1; c+=1; next } 
    {print > ("outputfile"count)}' c=1 count=1

要将前1000条记录输出到
outputfile0
,只需执行以下操作即可:

awk 'NR%1000 == 1{ file = "outputfile" i++ } { print > file }' ORS= RS=------ test.list
(注意,为了简单起见,我截断了RS中的破折号。)

不幸的是,使用大于一个字符的
RS
值会产生未指定的结果,因此上述方法无法解决问题。也许需要类似于特瓦尔伯格的解决方案:

awk '/^----$/ { if(!(c%1000)) count+=1; c+=1; next } 
    {print > ("outputfile"count)}' c=1 count=1

此解决方案主要起作用,但除第一个文件外,所有文件现在都以空行开始。每个
------------
记录分隔符后是否有空行?否,输入中没有空行。但是,在结果中,记录由一个换行符分隔(毕竟,分隔符是
--
而不是
--\n
),因此新文件中的第一条记录由一个换行符.Ack“分隔”!陷入gnu awk模式。在标准awk中,
RS
只能是一个字符,如果使用了多个字符,则结果是不确定的,因此确实需要使用twalberg建议的方法。这是GNU awk 4.0.1,因此这应该不是问题。据我所知,原始问题的记录之间用“--\n”分隔。根据我对Awk的理解,RS='--'不包括换行符,因此每个记录(除第一条记录外)实际上都以
\n
开头。设置RS=“-->\n”可以解决此问题,但输出中的记录之间根本没有分隔。此解决方案通常有效,但除第一个文件外,所有文件现在都以空行开头。每个
-->
记录分隔符后是否有空行?不,输入中没有空行。但是,在结果中,记录由一个换行符分隔(毕竟,分隔符是
--
而不是
--\n
),因此新文件中的第一条记录由一个换行符.Ack“分隔”!陷入gnu awk模式。在标准awk中,
RS
只能是一个字符,如果使用了多个字符,则结果是不确定的,因此确实需要使用twalberg建议的方法。这是GNU awk 4.0.1,因此这应该不是问题。据我所知,原始问题的记录之间用“--\n”分隔。根据我对Awk的理解,RS='--'不包括换行符,因此每个记录(除第一条记录外)实际上都以
\n
开头。设置RS=“--\n”可解决此问题,但输出中的记录之间根本没有分离。