GNU/Linux >> Belajar Linux >  >> Linux

Perintah Linux untuk menggabungkan file ke dirinya sendiri sebanyak n kali

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


Linux
  1. Contoh Perintah Cat Penting di Linux

  2. Perintah wc Linux

  3. ln Contoh Perintah di Linux

  1. Perintah grep Linux

  2. Perintah kucing Linux

  3. 14 Contoh Perintah "cat" yang Berguna di Linux

  1. 16 Contoh Perintah Cat Cepat di Linux

  2. Perintah Ekor Linux

  3. File Contoh Perintah di Linux