Как я могу перетасовать строки текстового файла в командной строке Unix или в сценарии оболочки? - PullRequest
264 голосов
/ 28 января 2010

Я хочу произвольно перемешать строки текстового файла и создать новый файл. Файл может содержать несколько тысяч строк.

Как я могу сделать это с cat, awk, cut и т. Д.?

Ответы [ 19 ]

5 голосов
/ 09 марта 2018

Простой и интуитивно понятный способ - использовать shuf.

Пример:

Предположим words.txt как:

the
an
linux
ubuntu
life
good
breeze

Чтобы перетасовать линии, выполните:

$ shuf words.txt

, который отбрасывает перетасованные строки на стандартный вывод ; Итак, вам нужно передать в выходной файл , например:

$ shuf words.txt > shuffled_words.txt

Один такой случайный ход может дать:

breeze
the
linux
an
ubuntu
good
life
4 голосов
/ 11 сентября 2016

У нас есть пакет для выполнения самой работы:

sudo apt-get install randomize-lines

Пример:

Создайте упорядоченный список номеров и сохраните его в 1000.txt:

seq 1000 > 1000.txt

чтобы перемешать, просто используйте

rl 1000.txt
3 голосов
/ 05 февраля 2017

Если, как и я, вы пришли сюда, чтобы найти альтернативу shuf для macOS, тогда используйте randomize-lines.

Установить randomize-lines (homebrew) пакет, который имеет команду rl, которая имеет функциональность, аналогичную shuf.

brew install randomize-lines

Usage: rl [OPTION]... [FILE]...
Randomize the lines of a file (or stdin).

  -c, --count=N  select N lines from the file
  -r, --reselect lines may be selected multiple times
  -o, --output=FILE
                 send output to file
  -d, --delimiter=DELIM
                 specify line delimiter (one character)
  -0, --null     set line delimiter to null character
                 (useful with find -print0)
  -n, --line-number
                 print line number with output lines
  -q, --quiet, --silent
                 do not output any errors or warnings
  -h, --help     display this help and exit
  -V, --version  output version information and exit
3 голосов
/ 11 июля 2013

Это скрипт на python, который я сохранил как rand.py в моей домашней папке:

#!/bin/python

import sys
import random

if __name__ == '__main__':
  with open(sys.argv[1], 'r') as f:
    flist = f.readlines()
    random.shuffle(flist)

    for line in flist:
      print line.strip()

В Mac OSX sort -R и shuf недоступны, поэтому вы можете использовать псевдоним этого в вашем bash_profile как:

alias shuf='python rand.py'
2 голосов
/ 20 июня 2014

Если у вас установлена ​​Scala, вот одна строка для перетасовки ввода:

ls -1 | scala -e 'for (l <- util.Random.shuffle(io.Source.stdin.getLines.toList)) println(l)'
1 голос
/ 22 января 2015

Эта функция bash имеет минимальную зависимость (только sort и bash):

shuf() {
while read -r x;do
    echo $RANDOM$'\x1f'$x
done | sort |
while IFS=$'\x1f' read -r x y;do
    echo $y
done
}
0 голосов
/ 28 апреля 2014

В окнах Вы можете попробовать этот пакетный файл , чтобы помочь вам перетасовать данные.

C:\> type list.txt | shuffle.bat > maclist_temp.txt

После выполнения этой команды maclist_temp.txt будет содержать рандомизированный список строк.

Надеюсь, это поможет.

0 голосов
/ 01 декабря 2017

Другой awk вариант:

#!/usr/bin/awk -f
# usage:
# awk -f randomize_lines.awk lines.txt
# usage after "chmod +x randomize_lines.awk":
# randomize_lines.awk lines.txt

BEGIN {
  FS = "\n";
  srand();
}

{
  lines[ rand()] = $0;
}

END {
  for( k in lines ){
    print lines[k];
  }
}
0 голосов
/ 17 апреля 2017

Пока не упоминается:

  1. unsort ути. Синтаксис (несколько ориентирован на плейлист):

    unsort [-hvrpncmMsz0l] [--help] [--version] [--random] [--heuristic]
           [--identity] [--filenames[=profile]] [--separator sep] [--concatenate] 
           [--merge] [--merge-random] [--seed integer] [--zero-terminated] [--null] 
           [--linefeed] [file ...]
    
  2. msort может перетасовать строку, но обычно это перебор:

    seq 10 | msort -jq -b -l -n 1 -c r
    
...