Pertanyaan Gabungkan beberapa baris secara dinamis dalam unix


Saya memiliki skenario di bawah ini:

Iterasi 1 -

Ddd
Bbb
Ccc
Ddd
Eee
Fff
Ddd

Iterasi 2 -

Ddd
Bbb
Ddd

Saya ingin menggabungkan data seperti di bawah ini -

Iterasi 1 keluaran -

Ddd Bbb Ccc
Ddd Eee Fff
Ddd

Iterasi 2 keluaran -

Ddd bbb
Ddd

Saya ingin menggunakan awk NR untuk membuat potongan dinamis untuk menggabungkan data yaitu NR% 3 dalam Iterasi 1 Output dan NR% 2 dalam Iterasi 2 Output.

Saya mencoba menggunakan variabel untuk menetapkan nilai secara dinamis yaitu NR% $ cnt tetapi itu menghasilkan kesalahan.

Mohon bantu.


3
2017-07-27 17:42


asal




Jawaban:


Metode saya tidak memerlukan asumsi seberapa sering Ddd terjadi; itu bisa terjadi tidak teratur. Metode ini harus berfungsi, kecuali ada karakter null di suatu tempat di input Anda atau input tidak diakhiri dengan baris baru (lihat ini), atau alat Anda terbatas (mis. sed -z tidak ditentukan oleh POSIX).

sed '1! s/^Ddd$/\x00Ddd/' | tr '\n' ' ' | sed -z 's/ $/\n/' | tr -d '\0'

Prosedur:

  1. sed mendeteksi garis yang ada Ddd dan mendahului masing-masing dengan karakter null, kecuali garis adalah yang pertama. Karakter null ini sekarang memisahkan garis-to-be kita.
  2. tr menggantikan setiap karakter baris baru dengan karakter spasi. Ini membangun garis-to-be kami: bekas garis sekarang dipisahkan dengan spasi.
  3. Masing-masing tapi baris-to-be terakhir berisi ruang ekstra di ujungnya dari baris baru yang semula Ddd; baris-to-be terakhir berisi ruang ekstra dari garis akhir yang diperlukan oleh POSIX. sed -z membaca string null terminated (garis-to-be) dan mengganti karakter spasi di belakang dengan baris baru normal. Pada saat ini garis-to-be menjadi jalur reguler.
  4. tr -d menghapus karakter null.

2
2017-07-27 19:21





Anda mungkin dapat menggunakan ini (ini dari GNU coreutils):

pr --columns=3 --across --separator=' ' --omit-pagination    # pr -3 -a -s' ' -T

Itu akan dibaca dari stdin atau dari file. Memberikan data kolom pertama Anda, hasilnya adalah sebagai berikut:

Ddd Bbb Ccc
Ddd Eee Fff
Ddd

Perubahan --columns=3 untuk --columns=2 untuk file kedua:

Ddd bbb
Ddd

1
2017-07-27 18:00



Terima kasih atas tanggapan Anda, tetapi saya sebenarnya mencari perintah khusus unix yang dapat digunakan dalam skrip - Tarun Mathur
Mengapa Anda tidak berpikir ini adalah perintah Unix yang dapat digunakan dalam skrip? - roaima


Ini adalah pilihan (ini dari findutils GNU):

xargs --no-run-if-empty --max-args=3    # xargs -r -n3

Itu akan dibaca dari stdin atau dari file. Memberikan data kolom pertama Anda, hasilnya adalah sebagai berikut:

Ddd Bbb Ccc
Ddd Eee Fff
Ddd

Perubahan --max-args=3 untuk --max-args=2 untuk file kedua:

Ddd bbb
Ddd

Ini pilihan lain, kali ini berbasis awk. Perubahan NR % 3 untuk NR % 2 untuk file kedua.

awk '{ printf "%s", $0 } { if (NR % 3) { printf " " } else { printf "\n" } }'

1
2017-07-27 21:42