我有大文件。它由每个 40 行的部分组成。有两种类型的零件并且它们交替出现。两种类型的零件应独立编号。所以第一部分应该是X_0001
,第二部分应该是Y_0001
,然后X_0002
,Y_0002
等等。
我使用了这个命令,但它只能分成具有相同前缀的部分:
split -d -l 40 -a 4 inputfile X_
答案1
一种方法是事后使用split
并重命名文件。
但最简单的可能是调用 awk。您可以使用>
重定向运算符写入文件而不是标准输出。该变量NR
包含当前行号。
Awk 的重定向自动负责打开文件。如果您使用许多不同的文件,则应该显式关闭文件,否则可能会遇到打开文件的限制。
awk '
(NR-1) % 40 == 0 { close(out); out = sprintf("%s_%04d", (NR % 80 == 1 ? "X" : "Y"), NR/80+1); }
{ print >out }
' inputfile
答案2
您gnu split
可以使用以下--filter
选项:
split --numeric-suffixes=0001 -l 80 -a 4 \
--filter='sed -n -e "1,40w $FILE" -e "41,80w ${FILE/X/Y}"' infile X_
这会将文件分成 80 行片段,通过管道将sed
前 40 行写入每个片段的内容$FILE
(片段名称,在本例中将split
其替换为X_????
- see man split
),其余内容的${FILE/X/Y}
名称相同,但使用X
取而代之Y
。
由于要求已经改变,您只需要分成具有交替名称的部分,您也可以使用awk
:
awk 'BEGIN{c=1;p="X"}
{close(fn);fn=sprintf("%s_%04d", p, c);print >> fn}
NR%40==0{p="Y"}NR%80==0{p="X";c++}' file1
这根据两个变量p
refix 和c
counterer 设置片段名称。每 40 行,p
refix 更改为Y
,每 80 行,p
refix 更改为X
且c
计数器递增。