2013-07-10 39 views
28

Tôi có một số tệp trong linux. Ví dụ 2 và tôi cần xáo trộn các tệp trong một tệp.phát ngẫu nhiên các tệp trong bash

Ví dụ

$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 

Và sau đó tôi xáo trộn hai tập tin tôi có thể có được một cái gì đó như:

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 
+4

thể trùng lặp của (http [Làm thế nào tôi có thể xáo trộn các dòng của một tập tin văn bản trong dòng lệnh Unix?]: // stackoverflow. com/questions/2153882/how-can-i-shuffle-the-line-of-a-text-file-in-unix-dòng lệnh) – jfs

Trả lời

57

Bạn nên sử dụng shuf command =)

cat file1 file2 | shuf 

Hoặc với Perl:

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

Tôi sẽ sử dụng shuf quá.

tùy chọn khác, gnu loại có:

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

bạn có thể thử:

cat file1 file2|sort -R 
+3

Hãy cẩn thận với phương thức 'sort -R': các dòng tương tự sẽ là đặt lại với nhau (thử nó với, ví dụ, hai lần cùng một tập tin, bạn sẽ ngạc nhiên). –

+0

@gniourf_gniourf thx để chỉ ra điều đó. vâng, nó là từ băm. – Kent

27

Sắp xếp:

cat file1 file2 | sort -R 

Shuf:

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- 
+4

Vui lòng không sử dụng 'sort -R' cho tác vụ này trừ khi bạn chắc chắn tất cả các dòng là khác biệt (xem nhận xét của tôi cho câu trả lời của Kent). –

+0

@gniourf_gniourf tất nhiên - chúng được sắp xếp theo khóa băm - cùng một dòng = cùng một khóa băm ... – jm666

+1

Xin chào cử tri xuống. Sẽ được tốt đẹp để biết làm thế nào để cải thiện câu trả lời. – jm666

18

Chỉ cần một lưu ý cho người dùng OS X người sử dụng MacPorts: lệnh shuf là một phần của coreutils và được cài đặt dưới tên gshuf.

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

Đối với các MacPort không phải: 'brew install coreutils' – Ali

1

Điều này phù hợp với tôi. Nó sử dụng shuffle Fisher-Yates.

randomize() 
{ 
    arguments=("[email protected]") 
    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 
} 
9

Dưới đây là một lớp lót mà không dựa vào shuf hay sort -R, mà tôi không có trên mac của tôi:

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

này lặp trên tất cả các dòng trong my_file và in lại chúng theo thứ tự ngẫu nhiên.

3

Bạn không cần sử dụng đường ống ở đây. Phân loại một mình thực hiện điều này với (các) tệp như tham số.Tôi sẽ chỉ làm

sort -R file1 

hoặc nếu bạn có nhiều file

sort -R file1 file2 
Các vấn đề liên quan