如何分割文件并交替使用输出文件的前缀?

如何分割文件并交替使用输出文件的前缀?

我有大文件。它由每个 40 行的部分组成。有两种类型的零件并且它们交替出现。两种类型的零件应独立编号。所以第一部分应该是X_0001,第二部分应该是Y_0001,然后X_0002Y_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

这根据两个变量prefix 和ccounterer 设置片段名称。每 40 行,prefix 更改为Y,每 80 行,prefix 更改为Xc计数器递增。

相关内容