2011-01-09 13 views
2

たとえば、私は、5行のテキストファイルがあります。テキストファイル乗算のbash linuxの

one 
two 
three 
four 
five 

を、私は 上のファイルのループを含む2000行のファイルを作成するためのスクリプトを作るために、それがなりたいですlike

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

答えて

0

スクリプトである必要がありますか? vim上で開くことができるだけですばやく生成したいのであれば、(5行をカットするために5ddよりもescを押す)n回挿入する(n回pをn回ペーストするよりescを押す)。

編集:あなたは絶対にスクリプトと効率が問題ではありません必要がある場合、あなたはこの「汚い」トリックを行うことができます。

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

'for'ループを使って、Bashに変数を管理させます。 'for((i = 0; i

0
file_size() { 
    cat -- "[email protected]" |wc -l 
} 

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

    shift 1 

    iter_size="$(file_size "[email protected]")" 

    let iters=max_lines/iter_size+1 

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

mult_file "[email protected]" 

ですから、script.sh LINES FILE1 FILE2 FILE3 >REPEAT_FILEのようにそれを呼び出します。

2

あなたは2000回

for i in {1..2000}; do cat "FILE"; done > NEW_FILE 
+1

リダイレクトを最後まで動かすと少し速くなります( '>'の代わりに '>'を使います。ファイルを最初に空にする必要があるかどうか心配する必要はありません)。 –

+0

@Dennis Williamson - ** salute !!! ** – ajreal

+0

@Dennis:どのようにリダイレクトを最後まで動かすことができますか?私が考えることができる唯一の方法は、ループを関数に入れることです。例えば。 'repeat'関数を呼び出して' $ {INPUT} ">" $ {OUTPUT} "を繰り返します。 'cat'が2000回呼び出されるので、これはまだ遅い方法です。 –

5

を繰り返す必要がある場合はテストが、これはこれまでの次善のアプローチに比べて約100倍高速であることを示しました。

#!/bin/bash                  

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

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

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

+0

なぜ 'echo" $ LIST ">" $ OUT "'? 'xargs'と' cat'には何がありますか? –

+0

@Dennis: 'echo" $ LIST ">" $ OUT "'は入力ファイル名の2000個のインスタンスを含む出力ファイルを与えます。 –

+0

ああ、あなたがそこで何をしたのか分かります。そのアプローチの問題は、引数の長さの制限を超える可能性があることです。 –

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" 

(分岐のオーバーヘッドを回避cat 2000倍):

file=$(<"$infile"); for i in {1..2000}; do echo "$file"; done > "$outfile" 
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