Saya punya file dengan garis-garis seperti di bawah ini.
title1:A1
title2:A2
title3:A3
title4:A4
title5:A5
title1:B1
title2:B2
title3:B3
title4:B4
title5:B5
title1:C1
title2:C2
title3:C3
title4:C4
title5:C5
title1:D1
title2:D2
title3:D3
title4:D4
title5:D5
Bagaimana saya bisa mencapai ini?
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
text-processing
columns
Dens
sumber
sumber
Jawaban:
Silakan lihat GNU datamash yang dapat digunakan seperti
datamash transpose
. Versi masa depan juga akan mendukung tabulasi silang (tabel pivot)sumber
Di luar menggulirkan solusi kustom untuk memindahkan baris dengan kolom dari baris perintah satu-satunya alat yang pernah saya lihat yang dapat melakukan ini adalah alat yang disebut ironisnya
transpose
.Instalasi
Sayangnya itu tidak dalam repo apa pun sehingga Anda harus mengunduh dan mengompilasinya. Ini cukup mudah karena tidak memiliki pustaka tambahan yang tergantung padanya. Itu bisa dicapai seperti:
Pemakaian
Itu dapat menangani file teks langsung dengan mudah. Sebagai contoh:
Dapat ditransposisikan menggunakan perintah ini:
Perintah ini adalah
transpose
untuk mengubah posisi (-t
) dan pemisah bidang yang digunakan adalah spasi (--fsep " "
).Contoh anda
Karena data sampel Anda berada dalam format yang sedikit lebih rumit, maka perlu ditangani dalam 2 fase. Pertama, kita perlu menerjemahkannya ke dalam format yang
transpose
dapat menangani.Menjalankan perintah ini, akan menempatkan data dalam format yang lebih ramah horizontal:
Sekarang kita hanya perlu menghapus kejadian sekunder dari title1, title2, dll .:
Sekarang dalam format yang
transpose
dapat menangani. Perintah berikut akan melakukan seluruh transposisi:sumber
Anda dapat menggunakannya
awk
untuk memproses data lalupaste
dancolumn
untuk memformatnya.Di sini saya berasumsi
title1
hanya sebuah contoh dalam posting Anda, dan bahwa data tidak mengandung:
kecuali sebagai pemisah antara header + data.n
menandakan berapa banyak kolom untuk dicetak (harus cocok dengan tanda hubungpaste
).Jika Anda ingin membuatnya lebih fleksibel dan mudah dirawat, Anda bisa menulisnya sebagai skrip. Berikut adalah contoh menggunakan bash wrapper untuk
awk
dan disalurkan kecolumn
. Dengan cara ini Anda juga bisa melakukan lebih banyak pengecekan data seperti mis. Memastikan tajuk benar di semua baris dll.Digunakan biasanya sebagai:
Jika tajuk selalu lebih pendek maka data Anda juga dapat menyimpan lebar tajuk, lalu
printf
dengan%-*s
dan lewaticolumn
semua.sumber
Berikut cara cepat untuk meletakkan file ke dalam format yang Anda inginkan:
Jika Anda ingin tajuk kolom:
Cara kerja perintah ke-2
mencetak spanduk menempatkan kembali setelah spanduk masuk mencetak deretan datasumber
Utilitas datamash GNU
Diambil dari situs ini, https://www.gnu.org/software/datamash/ dan http://www.thelinuxrain.com/articles/transposing-rows-and-columns-3-methods
sumber
Mungkin ada cara yang lebih ringkas untuk merumuskan ini tetapi ini tampaknya mencapai efek umum:
Banyak
sed
doa tidak terasa benar (dan saya cukup yakin juga bisa melakukan terjemahan baris baru) jadi itu mungkin bukan cara yang paling mudah untuk melakukannya. Selain itu, ini menghapus header calon, tetapi Anda dapat menghasilkan mereka secara manual setelah baris / bidang diformat dengan benar.Jawaban yang lebih baik mungkin akan menyaring efek ke hanya menggunakan
sed
atauawk
melakukan ini sehingga Anda hanya memiliki satu hal yang terjadi pada suatu waktu. Tapi saya lelah jadi ini yang bisa saya kumpulkan.sumber
paste
mungkin taruhan terbaik Anda. Anda dapat mengekstrak bit yang relevan dengancut
,grep
danawk
seperti ini:Jika kolom ke-5 harus dihilangkan, tambahkan
awk 'NR%5'
seperti ini:Sekarang beri kolom dengan
paste
:Keluaran:
sumber
Untuk bagian transpos saja, saya punya masalah yang sama baru-baru ini dan digunakan:
Sesuaikan fmt sesuai kebutuhan. Untuk setiap baris input, ini menggabungkan setiap bidang ke elemen array. Perhatikan bahwa gabungan string awk adalah implisit: itu terjadi ketika Anda menulis dua hal tanpa operator apa pun.
Sampel I / O:
keluaran:
sumber
Hal paling sederhana yang dapat Anda lakukan adalah menggunakan
cut
untuk memotong bidang dan kemudian menggunakantr
jika Anda mentransposisi baris ke kolom dengan mengganti karakter baris baru dengan karakter tab: http://www.gnu.org/software/coreutils/manual/ coreutils.html # tr-doasumber
cut
mengembalikan kesalahan.