【问题标题】:Extract blocks of lines with sed使用 sed 提取行块
【发布时间】:2018-06-15 16:49:08
【问题描述】:

如何使用 sed 以每 m 行提取文件的 n 行?

假设我的文本文件如下所示:

我的文件.dat:

1
2
3
4
5
6
7
8
9
10

假设我要提取三行的块,然后在整个文件中跳过两行,这样我的输出如下所示:

输出.dat:

1
2
3
6
7
8

关于如何使用 sed 实现这一点的任何建议?

编辑:

对于我的例子,我可以使用

sed -n 'p;n;p;n;p;n;n' myfile.dat > output.dat

或使用 GNU sed(由于可移植性而不是首选)

sed '1~5b;2~5b;3~5b;d' myfile.dat > output.dat

但是,我通常希望从一个包含 49 002 450 行的文件中打印 2450 行的块,这样我的输出文件就包含 247 450 行。

【问题讨论】:

  • 请添加您已经尝试过的内容。您正在投票,因为您没有添加研究工作...如果您是 sed 新手,请查看 stackoverflow.com/tags/sed/info 以获取学习资源...
  • 这个问题可能在某处有重复...这是跨站点重复:unix.stackexchange.com/questions/325985/…
  • 它适用于我的示例,但是在 n 和 m 很大的一般情况下会相当不方便。
  • 2450 - 它们是连续的行吗?在这种情况下,m 是什么?对于连续的行,awk 会更适合:awk -v n=3 -v m=5 '(NR-1)%m < n'
  • 太好了,谢谢! awk 确实似乎更适合这项任务。

标签: bash sed text-processing


【解决方案1】:

这可能对你有用(GNU sed):

sed -n '1~5,+2p' file

从第 1 行开始,打印模数为 5 的行号和以下两行。

另一种选择:

sed -n 'N;N;p;n;n' file

【讨论】:

  • 感谢您的回复,但是根据您的第一个建议,我收到错误消息:sed: -e expression #1, char 6: unknown command: `+'
  • 只是一个错字,应该是sed -n '1~5,+2p'
【解决方案2】:

在您的情况下,以下将起作用。它检查除以 5 时的余数在 1 和 3 之间:

awk 'NR%5==1, NR%5==3' myfile.dat

【讨论】:

  • 有趣但 NC 来自哪里?我在手册页中一无所获
  • ctac_ 和 Sundeep 你们都是对的——这只是因为他的每一行都有递增的数字。我已经编辑了我的答案,按照建议将$NC 替换为NR
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 2020-02-02
  • 2019-08-31
  • 2015-08-05
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多