【问题标题】:Print every n lines from a file从文件中每 n 行打印一次
【发布时间】:2015-03-06 09:16:59
【问题描述】:

我正在尝试打印文件中的每一行 nth,但 n 不是常量而是变量。

例如,我想将sed -n '1~5p' 替换为sed -n '1~${i}p'

这可能吗?

【问题讨论】:

  • 已在 askubuntu 上回答:askubuntu.com/questions/76808/…
  • 您的主题说every n lines,但文本说every nth line,这是一个非常不同的问题。发布示例输入和预期输出以澄清。

标签: bash variables sed


【解决方案1】:

例如,您可以这样做:

i=3
sed "2,${i}s/.*/changed line/g" InputFile

示例:

AMD$ cat File
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffff
ggggggggggggggggggggg

AMD$ i=4; sed "2,${i}s/.*/changed line/g" File
aaaaaaaaaaaaaaaaaaaaaaaa
changed line
changed line
changed line
eeeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffff
ggggggggggggggggggggg

关键是使用" "进行变量替换。

【讨论】:

    【解决方案2】:

    awk 也可以用更优雅的方式来做:

    awk -v n=YOUR_NUM 'NR%n==1' file
    

    -v n=YOUR_NUM 表示数字。然后,当行号在 7n+1 的形式上时,NR%n==1 的计算结果为 true,因此它会打印该行。

    注意使用awk 有多好:如果你想要7n+k 形式的行,你只需要这样做:awk -v n=7 'NR%n==k' file

    示例

    让我们每 7 行打印一次:

    $ seq 50 | awk -v n=7 'NR%n==1'
    1
    8
    15
    22
    29
    36
    43
    50
    

    或在sed

    $ n=7
    $ seq 50 | sed -n "1~$n p" # quote the expression, so that "$n" is expanded
    1
    8
    15
    22
    29
    36
    43
    50
    

    【讨论】:

    • 你的答案打印出不同的东西?当然第一个应该是NR%n==1
    • @Jidder 你确实是对的。更新了更多信息和解释。谢谢!
    • awk 版本也适用于 MacOS,而sed 版本则不适用。
    • +1 提醒我不必总是使用NR%n==0。我一直在做'(NR-1)%2==0'之类的事情。
    【解决方案3】:

    关键是,您应该使用双引号 " 而不是单引号来包装您的 sed 代码。变量不会在单引号内展开。所以:

    sed -n "1~${i} p"
    

    【讨论】:

    • 这在 MacOS 上不起作用。下面的awk 版本也适用于 MacOS。
    • @Sampo 这取决于你安装了哪个 sed,(很可能你有 bsd sed)。如果您阅读 OP 的问题,1~5p 为他工作。
    • 当然,但是在搜索一般的“每 n 行”解决方案时会出现这个问题。了解哪些解决方案的兼容性更广泛会很有用。
    【解决方案4】:

    为什么是 sed?

    head -${i} YourFile
    

    【讨论】:

    • OP 声明“我正在尝试从文件中打印每第 n 行”,这意味着例如第 1、11、21 等。您的答案不是这样做
    • @fedorqui:好吧,误会了,我明白打印第 n 行而不是第 n 行,抱歉
    • @NeronLeVelu 不是你的错 - 问题的主题是打印 n 行,而不是打印第 n 行,并且 OP 没有发布任何输入/输出来给我们提供线索。
    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多