使用标准命令行工具选择重复行

时间:2015-02-12 04:24:35

标签: python bash awk sed

给定一个包含字符串的文本文件,我想用随机替换(重复)绘制。

我知道人们可以用" shuf"来有效地洗牌。命令。使用重复绘制行的标准linux命令行工具是什么?

我目前的方法是Python脚本,它基本上生成[1,N]范围内的随机数,其中N是行数。生成的随机数(整数)用于索引字符串列表,然后打印。

这是我的Python脚本:

  1 #!/usr/bin/env python
  2 
  3 from random import random
  4 import sys
  5 
  6 fname = sys.argv[1]
  7 
  8 with open( fname, 'r' ) as f:
  9         lines = f.readlines()
 10 lines = [ s.strip("\n") for s in lines ]
 11 
 12 nlines = len( lines )
 13 
 14 for i in range( nlines ):
 15         idx = round(random()*nlines)
 16         idx = int( idx )
 17         print lines[ idx ]

示例文件是:

a
b
c
d
e
f
g
h

在示例上运行脚本的结果是:

c
b
f
b
c
c
b
d

1 个答案:

答案 0 :(得分:1)

现代版shuf为重复提供-r选项。例如:

$ cat input
1
2
3
4
5
$ shuf -n 5 -r input
3
2
5
3
3
$ shuf --version
shuf (GNU coreutils) 8.23

早期版本的shuf可能缺少-r

替代方案:使用awk

$ awk '{a[NR]=$0} END{srand();for (i=1;i<=NR;i++)print a[int(1+NR*rand())]}' input
4
3
1
2
3