linux - 提取长度为 X 且间隔为 Y 行的行

标签 linux awk sed

我的测试数据

aa1
bb1
cc1
aa2
bb2
cc2
aa3
bb3
cc3
aa4
bb4
cc4
aa5
bb5
cc5
aa6
bb6
cc6
aa7
bb7
cc7
aa8
bb8
cc8

假设我希望将第 4-6 行 (aa2-cc2) 提取到文件中,然后跳过 6 行并提取第 13-15 行 (aa5-cc5),然后同样跳过 6 行。该过程将重复,直到文件结束。我写了一个 bash 脚本,它适用于小文件。

#!/bin/bash
for i in {2..8..3}; do

sed -n "$((3*i-2))","$((3*i))"p testdata > "$i".part

done

现在我正在处理一个 30 GB 的巨型文件,我的脚本对硬盘不利,因为它会读取同一个文件数千次。我希望通过只读取(并提取我的部分)文件一次来避免硬盘损坏。有没有可以解决我的问题的单行程序?

我不是真正的程序员,所以请忍受我的问题中的任何术语混淆。感谢您的帮助!

最佳答案

只需要一次遍历文件即可。加上一点算术。

awk '{n = NR % 9} 4 <= n && n <= 6' file

关于linux - 提取长度为 X 且间隔为 Y 行的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46955723/

相关文章:

c++ - 未定义对 'cudaRegisterLinkedBinary'的引用-CMake中的链接错误?

arrays - 我可以使用 -v 将数组传递给 awk 吗?

bash - 我怎样才能用awk跳过一行

macos - 为什么sed在接收多个文件作为输入时只处理一个文件?

linux - 使用 sed 脚本每隔一行将当前行的一部分与下一行的一部分组合起来

sed - 按特定行范围内的模式删除行

c - 使用系统调用在 Linux 中使用 C 将两个文本文件合并为新文件(每一行来回)

windows - 从 Windows 远程运行 Linux 脚本并获取执行结果代码

linux - 将格式从 %Y%m%d%H%M% 更改为另一种格式

bash - 在 shell 脚本中提取引号中的单词