79

Linuxにいくつかのファイルがあります。たとえば、2 つのファイルを 1 つのファイルにシャッフルする必要があります。

例えば

$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

その後、2つのファイルをシャッフルすると、次のようなものを取得できます。

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

8 に答える 8

131

コマンドを使用する必要がありますshuf=)

cat file1 file2 | shuf

またはPerlで:

cat file1 file2 | perl -MList::Util=shuffle -wne 'print shuffle <>;'
于 2013-07-10T19:05:01.973 に答える
51

並べ替え: (類似した行はまとめられます)

cat file1 file2 | sort -R

シャフ:

cat file1 file2 | shuf

パール:

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

バッシュ:

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

ぎこちない:

cat file1 file2 | awk 'BEGIN{srand()}{printf "%06d %s\n", rand()*1000000, $0;}' | sort -n | cut -c8-
于 2013-07-10T21:36:55.943 に答える
25

MacPorts を使用する OS X ユーザーへの注意:shufコマンドはの一部でcoreutilsあり、 name の下にインストールされますgshuf

$ sudo port install coreutils
$ gshuf example.txt # or cat example.txt | gshuf
于 2015-05-18T11:27:30.623 に答える
13

shufこれは、またはに依存しないワンライナーですsort -R。私のMacにはありませんでした:

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

これは、すべての行を反復しmy_file、ランダムな順序で再印刷します。

于 2015-11-13T02:26:34.400 に答える
6

私も使いshufます。

別のオプション、gnu sort には次のものがあります。

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

あなたが試すことができます:

cat file1 file2|sort -R
于 2013-07-10T20:06:03.940 に答える
1

これは私にとってはうまくいきました。Fisher-Yates シャッフルを採用しています。

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
}
于 2015-06-18T05:57:09.693 に答える