如何从给定范围内删除文本文件中的随机行?

如何从给定范围内删除文本文件中的随机行?

我有一个文本文件,我想从某个范围内删除随机行。以下是示例:

Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz

在这六个中,我想随机删除 3 个。

如何完成?如果 vim 中有一个解决方案,那就太好了,这样就可以将它应用于不同的范围。

答案1

这是一个使用的解决方案sed

sed -i $((开始+ 随机 %范围))d 文件名.txt

在哪里:

  • 开始是你的范围的起始行号
  • 范围(或者结束-开始是要包含的行数开始
  • sed -i -Nd告诉sed删除输入文件中的第 N 行
  • RANDOM是 bash 的随机数生成器;一个特殊的 shell 变量,当您使用它时,它会保存一个介于 0 到 32767 之间的随机整数。

例如,删除文件中第 90 行和第 120 行之间的随机行测试.txt,你可以使用:

sed -i $((90+ 随机 %三十))d 测试.txt

答案2

为了删除文本文件中特定范围内的多条随机行,我执行以下操作:

  • 在 vim 中打开文件
  • 转到要从中移除多个随机行的范围的顶部。该范围的底部应该有一个空行
  • 输入以下命令:

    .,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
    

。 - 从这里

,/^\s*$/-1 - 直到最后一个非空行

!sed -e $((9 * $RANDOM / 32267))d - sed 命令用于删除随机行

这将随机删除一行。

现在,如果您想删除另外 5 条随机行,只需输入 5@:,vim 就会完成剩下的工作。

如果我可以用一些通用的表达式替换 9(要删除的行数),则可以进一步改进

答案3

使用以下命令

:nd

其中 n 是行号。

答案4

也可以python

bash-4.3$ python -c 'import sys,random;lines=sys.stdin.readlines();lines.pop(random.randint(0,len(lines)-1));print "".join(lines)' < input.txt
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 5: qrst
Line 6: uvwxyz

这里的过程很简单,我们将输入文件重定向到 pythonstdin并将所有行读入列表。然后我们通过random.randint()函数在列表中所有索引的范围内选择随机行索引,从索引 0 到最后一个索引(这就是所做的len(lines)-1)。该索引通过从列表中删除lines.pop(),然后我们打印重新组装的文本。很简单

相关内容