текстовый файл умножить Bash Linux - PullRequest
2 голосов
/ 09 января 2011

Например, у меня есть текстовый файл с 5 строками:

one
two
three
four
five

, и я хочу создать скрипт для создания файла из 2000 строк, содержащего циклы файла выше, и он будет выглядеть как

    one
    two
    three
    four
    five
    one
    two
    three
    four
    five
    one
    two
    three
    four
    five
 ............repeat until n times is reached

Ответы [ 6 ]

5 голосов
/ 09 января 2011

Тестирование показало, что это примерно в 100 раз быстрее, чем следующий лучший подход, приведенный до сих пор.

#!/bin/bash                                                                     

IN="${1}"
OUT="${2}"

for i in {1..2000}; do
    echo "${IN}"
done | xargs cat > "${OUT}"

Причина, по которой это происходит намного быстрее, состоит в том, что он не открывается, пытается завершить, добавить и закрыть выходной файл. Он открывает выходной файл один раз и направляет в него данные за одну большую непрерывную запись. Он также вызывает cat как можно меньше раз. Он может вызывать cat только один раз, даже в зависимости от максимальной длины командной строки системы и длины имени входного файла.

4 голосов
/ 09 января 2011

Если вам нужно повторить 2000 раз

for i in {1..2000}; do cat "FILE"; done > NEW_FILE
2 голосов
/ 09 января 2011

Вам нужно 2000 строк или 2000 копий исходного файла?

Если первое:

infile='/path/to/inputfile'
outfile='/path/to/outputfile'
len=$(wc -l < "$infile")
for ((i=1; i<=2000/len; i++))
do
    cat "$infile"
done > "$outfile.tmp"    # you can use mktemp or tempfile if you want
head -n 2000 "$outfile.tmp" > "$outfile"
rm "$outfile.tmp"

Если второе:

for i in {1..2000}; do cat "$infile"; done > "$outfile"

Длянебольшой входной файл (исключает накладные расходы на разветвление cat 2000 раз):

file=$(<"$infile"); for i in {1..2000}; do echo "$file"; done > "$outfile"
0 голосов
/ 10 января 2011

Нет процесса в цикле, нет труб:

infile='5.txt'
outfile='2000.txt'

n=$((2000/ $(wc -l < "$infile") ))      # repetitions

> "$outfile"                            # empty output file

IFS=''
content=$(cat "$infile")                # file content as string

for (( CNTR=0; CNTR<n; CNTR+=1 )); do
  echo "$content" >> "$outfile"
done
0 голосов
/ 09 января 2011
file_size() {
    cat -- "$@" |wc -l
}

mult_file() {
    local \
        max_lines="$1" \
        iter_size \
        iters \
        i

    shift 1

    iter_size="$(file_size "$@")"

    let iters=max_lines/iter_size+1

    (for ((i=0; i<iters; ++i)); do
        cat -- "$@"
    done) |
    head --lines="$max_lines"
}

mult_file "$@"

Так вы бы назвали это как script.sh LINES FILE1 FILE2 FILE3 >REPEAT_FILE.

0 голосов
/ 09 января 2011

Должен ли это быть скрипт?Если вы просто хотите быстро сгенерировать, что вы можете открыть в vim, вырезать (нажмите esc, чем 5dd, чтобы вырезать 5 строк) и затем вставить n раз (нажмите esc, чем np, чтобы вставить n раз).

Редактировать: если вам абсолютно необходим скрипт и эффективность не является проблемой, вы можете сделать этот "грязный" трюк:

i=0;
n=5;
while(($i < $n)) ; do
    cat orginal_file >> new_file;
    let i+=1;
done
...