在bash中随机洗牌文件

我在linux中有一些文件。 例如2和我需要在一个文件中洗牌文件。

例如

$cat file1 line 1 line 2 line 3 line 4 line 5 line 6 line 7 line 8 

 $cat file2 linea one linea two linea three linea four linea five linea six linea seven linea eight 

后来,我洗牌的两个文件,我可以得到像这样的东西:

 linea eight line 4 linea five line 1 linea three line 8 linea seven line 5 linea two linea one line 2 linea four line 7 linea six line 1 line 6 

Solutions Collecting From Web of "在bash中随机洗牌文件"

你应该使用shuf命令=)

 cat file1 file2 | shuf 

或者用Perl:

 cat file1 file2 | perl -MList::Util=shuffle -wne 'print shuffle <>;' 

分类:

 cat file1 file2 | sort -R 

舒夫:

 cat file1 file2 | shuf 

Perl的:

 cat file1 file2 | perl -MList::Util=shuffle -e 'print shuffle<STDIN>' 

BASH:

 cat file1 file2 | while IFS= read -r line do printf "%06d %s\n" $RANDOM "$line" done | sort -n | cut -c8- 

AWK:

 cat file1 file2 | awk 'BEGIN{srand()}{printf "%06d %s\n", rand()*1000000, $0;}' | sort -n | cut -c8- 

只需注意使用MacPorts的OS X用户: shuf命令是coreutils一部分,安装在名称gshuf

 $ sudo port install coreutils $ gshuf example.txt # or cat example.txt | gshuf 

这里是一个不依赖shuf或者sort -R shuf ,我没有在我的mac上:

 while read line; do echo $RANDOM $line; done < my_file | sort -n | cut -f2- -d' ' 

这遍历my_file所有行,并以随机顺序重新打印它们。

我也会用shuf

另外一个选项,gnu sort有:

  -R, --random-sort sort by random hash of keys 

你可以尝试:

 cat file1 file2|sort -R 

这对我有效。 它采用了Fisher-Yates shuffle。

 randomize() { arguments=("$@") declare -a out i="$#" j="0" while [[ $i -ge "0" ]] ; do which=$(random_range "0" "$i") out[j]=${arguments[$which]} arguments[!which]=${arguments[i]} (( i-- )) (( j++ )) done echo ${out[*]} } random_range() { low=$1 range=$(($2 - $1)) if [[ range -ne 0 ]]; then echo $(($low+$RANDOM % $range)) else echo "$1" fi }