【问题标题】:Bash awk, print and skip certain lines output to another text fileBash awk,打印并跳过某些行输出到另一个文本文件
【发布时间】:2021-02-17 05:24:42
【问题描述】:

我有一些数据的输出文件,我只对某些数据点感兴趣。

我想要前 361 行中的数据,然后让它跳过接下来的 541 行,然后对输出文件的其余部分重复此过程。

即打印 361,跳过下一个 541 并重复。欢迎任何帮助/建议。

示例:

Li            #value        #value     #value         (desired text)

... (361 lines)

Ge            #value        #value     #value       (undesired text)

... (541 lines)

Li (again desired) for 361 lines

Ge (again undesired) for another 541 lines

and so on

【问题讨论】:

  • 欢迎来到 SO。在 SO 上,我们鼓励用户在他们的问题中添加 3 分。第一个输入样本,第二个输出样本和第三个他们的努力(以代码的形式),请使用这些详细信息编辑您的问题,然后让我们知道。
  • 这适用于第一组,但是是否可以在不指定行号的情况下重复打印和跳过的过程?该文件非常大(超过 450 万行)谢谢!
  • 虽然您的实际输入可能非常大,但您创建的要包含在问题中的 minimal reproducible example 不会。想出一个例子,比如说,15 行长来说明你的问题。

标签: bash awk text


【解决方案1】:
awk '(NR - 1) % 902 < 361 {print}' file

对于每组 902 行(361 和 541 的总和),打印前 361 行。为清楚起见,添加了 {print} 操作(并非严格要求,因为这是默认的 awk 操作)。

【讨论】:

  • 我想添加 902 是添加 361 和 541 的效果,供任何想知道其来源的人使用。
【解决方案2】:
awk -v printmrk=361 -v skip=541 'BEGIN { start=1;end=printmrk } NR == end+1 { start=end+skip;end=start+printmrk } NR<=end && NR>=start { print $0 }' file

将 printmrk 设置为要打印和跳过的行数,要跳过的行,将它们相应地传递给 awk。在开始块中,将开始变量设置为 1,将结束变量设置为传递的 printmrk 变量。当 NR 等于 end + 1 时,我们需要相应地重新设置 start 和 end,然后当 NR 小于等于 end AND NR 大于等于 start 时,打印该行。

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 2023-03-11
    • 2020-05-01
    • 1970-01-01
    • 2019-03-29
    • 2015-02-04
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多