bash - 根据模式将一个文件拆分为多个文件

标签 bash sed split awk

我有一个二进制文件,我使用 hexdump 和一些 awk 和 sed 命令将其转换为常规文件。输出文件看起来像这样 -

$cat temp
3d3d01f87347545002f1d5b2be4ee4d700010100018000cc57e5820000000000000000000
000000087d3f513000000000000000000000000000000000001001001010f000000000026 
58783100b354c52658783100b43d3d0000ad6413400103231665f301010b9130194899f2f
fffffffffff02007c00dc015800a040402802f1d5b2b8ca5674504f433031000000000004
6363070000000000000000000000000065450000b4fb6b4000393d3d1116cdcc57e58287d
3f55285a1084b

临时文件很少有吸引眼球的地方 (3d3d),它们不会经常重复。它们有点表示新二进制记录的开始。我需要根据这些吸引眼球的地方拆分文件。

我想要的输出是有多个文件(基于我的临时文件中吸引眼球的数量)。

所以我的输出看起来像这样 -

$cat temp1
3d3d01f87347545002f1d5b2be4ee4d700010100018000cc57e582000000000000000
0000000000087d3f513000000000000000000000000000000000001001001010f00000000
002658783100b354c52658783100b4

$cat temp2
3d3d0000ad6413400103231665f301010b9130194899f2ffffffffffff02007c00dc0
15800a040402802f1d5b2b8ca5674504f4330310000000000046363070000000000000000
000000000065450000b4fb6b400039

$cat temp3
3d3d1116cdcc57e58287d3f55285a1084b

最佳答案

awk 中的 RS 变量对此非常有用,它允许您定义记录分隔符。因此,您只需要在其自己的临时文件中捕获每条记录。最简单的版本是:

cat temp |
  awk -v RS="3d3d" '{ print $0 > "temp" NR }' 

示例文本以引人注目的 3d3d 开头,因此 temp1 将是一个空文件。此外,引人注目的本身不会出现在临时文件的开头,如问题中的临时文件所示。最后,如果有很多记录,您可能会遇到系统打开文件的限制。一些小的并发症会使它更接近您想要的并使其更安全:

cat temp |
  awk -v RS="3d3d" 'NR > 1 { print RS $0 > "temp" (NR-1); close("temp" (NR-1)) }' 

关于bash - 根据模式将一个文件拆分为多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8061475/

相关文章:

c++ - 如何导出链接器选项?

linux - 将两个文件与公共(public)列合并

linux - 在文件中每第 n 次出现字符时插入内容

linux - 如何使用 sed 在 mac 上更改行 (Darwin)

python - 如何拆分训练集和测试集?

java - Guava Splitter.onPattern(..).split() 与 String.split(..) 有何不同?

linux - 在 Bash 中捕获警报错误

bash - zsh 或 bash 是否有方便英文文本的引号?

linux - 如何使用 awk 显示文本文件中的某些特定字段?

java - 读取字符串直到空格然后拆分 - Java