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