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}"

之所以这么快,是因为它不会重复打开、寻求结束、追加和关闭输出文件。它打开输出文件一次,并以一次大的连续写入将数据流式传输到它。它还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"

如果是第二个:

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
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 回答
0

必须是脚本吗?如果您只想快速生成可以在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
于 2011-01-09T13:57:14.233 回答