我有一个要求,我必须以下划线模式拆分文件,并且生成的文件中的行应该最多有5行,如果结果超过5行,则应该更改文件名,其余部分应该将行放在其他拆分文件中,然后将结果分组。
例如:
我的文件包含,
ADD1_5001AB
ADD1_5002AB
ADD1_5003BC
ADD1_5004AB
ADD1_5005AB
ADD1_5006BC
ADD1_5007AB
ADD1_5008AB
ADD1_5009BC
ADD1_5010AB
ADD1_5011AB
ADD1_5012BC
ADD2_5100XY
ADD2_5101YZ
CANC1_5200AB
CANC1_5201BC
CANC2_5301GH
CANC2_5302FG
所以我的结果应该有6个文件,
第一个文件应包含,
ADD1_5001AB
ADD1_5002AB
ADD1_5003BC
ADD1_5004AB
ADD1_5005AB
第二个文件应包含,
ADD1_5006BC
ADD1_5007AB
ADD1_5008AB
ADD1_5009BC
ADD1_5010AB
第三个文件应包含,
ADD1_5011AB
ADD1_5012BC
第四个文件应包含,
ADD2_5100XY
ADD2_5101YZ
第五个文件应包含,
CANC1_5200AB
CANC1_5201BC
第6个文件应包含,
CANC2_5301GH
CANC2_5302FG
请帮助。
答案 0 :(得分:1)
您可以使用
awk -F _ 'prefix != $1 || line == 5 { line = 0; ++slab; out = sprintf("out%02d.txt", slab); prefix = $1 } { ++line; print > out }' input.txt
其中input.txt
是输入文件。其工作原理如下:_
用作字段分隔符,因此$1
是第一个_
之前的前缀。然后:
# prefix contains the last seen first field. When it changes or when the last
# slab grew to five lines long, we need to start a new output file. So
prefix != $1 || line == 5 {
line = 0 # reset line counter
++slab # increase slab number
out = sprintf("out%02d.txt", slab) # use that number to generate a new output
# file name
prefix = $1 # and remember the new prefix
}
# then, for all lines:
{
++line # increase line counter
print > out # and print the line to the current output
# file.
}
如上所述,这将生成文件out01.txt
,out02.txt
等等。更改sprintf
调用中的格式字符串以自定义。