linux - 根据特定的搜索模式拆分文件,并使用 AWK 命令在拆分文件中包含特定行数

标签 linux unix awk sed split

我有一个要求,我必须以下划线模式拆分文件,并且生成的文件中的行最多应有 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

第 5 个文件应包含,

CANC1_5200AB
CANC1_5201BC

第 6 个文件应包含,

CANC2_5301GH
CANC2_5302FG

请帮忙。

最佳答案

你可以使用

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.txtout02.txt 等等。更改 sprintf 调用中的格式字符串以对其进行自定义。

关于linux - 根据特定的搜索模式拆分文件,并使用 AWK 命令在拆分文件中包含特定行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41530812/

相关文章:

ruby-on-rails - 如何让crontab成功启动WEBrick

asp.net - 将 ASP.NET Core 1.1 发布到基于 Linux 的应用服务

linux - 如何使用 lynx 命令行发布 JSON 数据?

bash - Bash 中的 boolean 运算符(&&、-a、||、-o)

shell - 如何删除shell脚本中的子字符串

Linux awk 列比较

linux - 静态链接的二进制文件如何比动态链接的二进制文件小?

c - 在 free() 之后使用指针

C - 优雅地中断 msgrcv 系统调用

linux - 在 bash 中按日期字段对日志进行排序