Dua bagian untuk ini, bagi saya - pertama - menggunakan cat untuk menampilkan file teks ke output standar, dan menggunakan append untuk menambahkannya ke file lain - misalnya foo.txt>>bar.txt akan menambahkan foo.txt ke bar.txt
lalu jalankan n kali dengan
for i in {1..n};do cat foo.txt >> bar.txt; done
mengganti n dalam perintah itu dengan nomor Anda
harus berfungsi, di mana n adalah nomor Anda
Jika Anda menggunakan csh, ada perintah 'repeat'.
ulangi bagian terkait dari jawaban disalin dari sini , dan saya mengujinya pada sistem ubuntu 11.04 pada bash shell default.
Anda pasti bisa menggunakan cat untuk ini:
$ cat /tmp/f
foo
$ cat /tmp/foo /tmp/f
foo
foo
Untuk mendapatkan $n salinan, Anda dapat menggunakan yes disalurkan ke head -n $n :
$ yes /tmp/f | head -n 10
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
Menyatukannya memberikan
yes /tmp/f | head -n $n | xargs cat >/tmp/output
Saya bosan jadi inilah beberapa metode lagi tentang cara menggabungkan file ke dirinya sendiri, kebanyakan dengan head sebagai kruk. Maafkan saya jika saya terlalu menjelaskan diri saya sendiri, saya hanya suka mengatakan hal-hal :P
Dengan asumsi N adalah jumlah rangkaian mandiri yang ingin Anda lakukan dan file Anda diberi nama file .
Variabel:
linecount=$(<file wc -l)
total_repeats=$(echo "2^$N - 1" | bc) # obtained through the power of MATH
total_lines=$((linecount*(total_repeats+1)))
tmp=$(mktemp --suffix .concat.self)
Diberi salinan file disebut file2 , total_repeats adalah frekuensi file perlu ditambahkan ke file2 untuk membuatnya sama seperti file digabungkan dengan dirinya sendiri N kali.
Kata MATH ada di sini, kurang lebih:MATEMATIKA (inti)
Ini materi ilmu komputer semester pertama tapi sudah lama sejak saya melakukan bukti induksi jadi saya tidak bisa melupakannya ... (juga kelas rekursi ini cukup terkenal 2^Loops jadi ada itu juga....)
POSIX
Saya menggunakan beberapa hal non-posix tetapi tidak penting. Untuk tujuan saya:
yes() { while true; do echo "$1"; done; }
Oh, saya hanya menggunakan itu. Baiklah, bagiannya sudah ada di sini...
Metode
head dengan pelacakan jumlah baris.
ln=$linecount
for i in $(seq 1 $N); do
<file head -n $ln >> file;
ln=$((ln*2))
done
Tidak ada file temp, tidak ada kucing, bahkan belum terlalu banyak matematika, semuanya menyenangkan.
tee dengan MATH
<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file
Ini tee sedang membaca dari file tetapi terus-menerus menambahkannya, sehingga akan terus membaca file berulang kali hingga head menghentikannya. Dan kami tahu kapan harus menghentikannya karena MATH . Penambahannya berlebihan, jadi saya menggunakan file temp. Anda dapat memangkas garis berlebih dari file juga.
eval , penguasa kegelapan!
eval "cat $(yes file | head -n $((total_repeats+1)) | tr '\n' ' ')" > $tmp
cat $tmp > file
Ini hanya meluas ke cat file file file ... dan mengevaluasinya. Anda dapat melakukannya tanpa $tmp file juga:
eval "cat $(yes file | head -n $total_repeats | tr '\n' ' ')" |
head -n $((total_lines-linecount)) >> file
head kedua "trik" cat dengan menempatkan perantara antara itu dan operasi tulis. Anda bisa mengelabui cat dengan cat lainnya juga tetapi itu memiliki perilaku yang tidak konsisten. Coba ini:
test_double_cat() {
local Expected=0
local Got=0
local R=0
local file="$(mktemp --suffix .double.cat)"
for i in $(seq 1 100); do
printf "" > $file
echo "1" >> $file
echo "2" >> $file
echo "3" >> $file
Expected=$((3*$(<file wc -l)))
cat $file $file | cat >> $file
Got=$(<file wc -l)
[ "$Expected" = "$Got" ] && R="$((R+1))"
done
echo "Got it right $R/100"
rm $file
}
sed :
<file tr '\n' '\0' |
sed -e "s/.*/$(yes '\0' | head -n $total_repeats | tr -d '\n')/g" |
tr '\0' '\n' >> file
Memaksa sed untuk membaca seluruh file sebagai satu baris, menangkap semuanya, lalu menempelkannya $total_repeats beberapa kali.
Ini tentu saja akan gagal jika Anda memiliki karakter nol di file Anda. Pilih satu yang Anda tahu tidak ada.
find_missing_char() {
local file="${1:-/dev/stdin}"
firstbyte="$(<$file fold -w1 | od -An -tuC | sort -un | head -n 1)"
if [ ! "$firstbyte" = "0" ]; then
echo "\0"
else
printf "\\$(printf '%03o\t' $((firstbyte-1)) )"
fi
}
Itu saja untuk saat ini kawan, saya harap jawaban sewenang-wenang ini tidak mengganggu siapa pun. Saya menguji semuanya berkali-kali tetapi saya hanya pengguna shell dua tahun jadi ingatlah itu. Sekarang tidur...
rm $tmp