3

たとえば、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
4

6 に答える 6

6

テストでは、これがこれまでに与えられた次善のアプローチよりも約100倍速いことが示されました。

#!/bin/bash                                                                     

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

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

これが非常に高速である理由は、出力ファイルを繰り返し開いたり、終了したり、追加したり、閉じたりしないためです。出力ファイルを1回開き、1回の大きな連続書き込みでデータをストリーミングします。またcat、可能な限り少ない回数で呼び出します。catシステムの最大コマンドライン長と入力ファイル名の長さによっては、一度だけ呼び出すことができます。

于 2011-01-09T14:27:55.283 に答える
5

2000回繰り返す必要がある場合

for i in {1..2000}; do cat "FILE"; done > NEW_FILE
于 2011-01-09T14:10:05.717 に答える
2

元のファイルの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"

2番目の場合:

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

小さな入力ファイルの場合(cat2000回のフォークのオーバーヘッドを回避します):

file=$(<"$infile"); for i in {1..2000}; do echo "$file"; done > "$outfile"
于 2011-01-09T14:45:46.440 に答える
0

スクリプトである必要がありますか?vimで開くことができるものをすばやく生成したい場合は、カットし(5ddよりもescを押して5行をカットします)、n回挿入します(npよりもescを押してn回貼り付けます)。

編集:スクリプトがどうしても必要で、効率が問題にならない場合は、次の「汚い」トリックを実行できます。

i=0;
n=5;
while(($i < $n)) ; do
    cat orginal_file >> new_file;
    let i+=1;
done
于 2011-01-09T13:57:14.233 に答える
0
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

于 2011-01-09T14:05:46.757 に答える
0

ループ内にプロセスがなく、パイプもありません:

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
于 2011-01-10T12:15:26.540 に答える