我有一个文本文件,我想从某个范围内删除随机行。以下是示例:
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()
,然后我们打印重新组装的文本。很简单