Saya mencoba mengonversi file teks menjadi spreadsheet yang dipisahkan dengan tab. File teks saya kira-kira seperti ini:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Dengan fungsi pencarian dan penggantian standar di Gedit atau LibreOffice, mudah untuk mengganti ujung baris dengan sebuah tab. Tetapi jika saya hanya menukar pengembalian carriage dengan tab, saya akan mendapatkan ini:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Tapi yang perlu saya lakukan adalah membuatnya terlihat seperti ini:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Jadi, dapatkah saya menukar setiap ujung karakter baris dengan tab kecuali untuk setiap baris keempat?
Saya tidak tahu apakah iterasi bersyarat semacam itu dapat dilakukan dengan ekspresi reguler di dalam program seperti Gedit atau LibreOffice, jadi mungkin ini perlu semacam fungsi baris perintah? Saya bahkan tidak jelas apa alat terbaik untuk memulai.
Memperbarui:
Saya mencoba perintah berikut:
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
Tetapi ketika saya mencoba untuk membuka tsv
file yang dihasilkan di LibreOffice, kolomnya kurang tepat. Saya tidak yakin apakah ini berarti saya tidak menjalankan perintah di atas dengan benar, atau jika saya melakukan sesuatu yang salah dalam fungsi impor LibreOffice:
Hanya untuk referensi, hasil yang diinginkan akan terlihat seperti ini:
sumber
dos2unix
danunix2dos
.Anda dapat menggunakan
xargs
untuk selalu mengelompokkan empat baris menjadi satu, masing-masing dipisahkan dengan satu ruang:-d '\n'
menyetel pembatas input ke karakter baris baru, jika tidak maka akan memecah spasi. Jika Anda hanya memiliki satu kata per baris input, Anda bahkan dapat menghilangkannya.-n4
set nomor argumen (jumlah item input per jalur output) ke 4.Keluaran:
Atau jika Anda ingin tab sebagai pemisah alih-alih spasi, Anda dapat menggantinya sesudahnya. Namun, jika Anda memiliki spasi di jalur input Anda, itu akan diganti juga:
Output (lihat tergantung pada lebar tab browser / terminal):
sumber
Anda juga bisa menggunakan:
Dua variabel bawaan awk adalah:
ORS
: O utput R ecord S eparator (default = newline). Itu ditambahkan di akhir setiap perintah cetak.NR
: N Banyaknya arus R ow awk adalah pengolahan.Perintah ini akan, untuk setiap baris, menampilkan konten kolom pertama (dan hanya di sini). Kemudian ia memilih untuk menambahkan baris baru atau tab dengan menguji sisa pembagian
NR
dengan 4.sumber
awk
Pendekatan terpendek lainnya :Ini printf hanya satu kolom diikuti oleh berikutnya dan berikutnya dan ... dan Tab
\t
karakter setelah masing-masing tapi akan printf sebuah\n
karakter ewline ketika N Banyaknya R ecord adalah faktor 4 (di manaNR%4
akan kembali 0 (false) yang adalah apa yang Ternary Operatorcondition(s)?when-true:when-false
sedang melakukan.)sumber
Solusi saya untuk ini adalah dengan menggunakan kombinasi
sed
dansed
. Pertama, Anda dapat menandai setiap baris keempat dengan beberapa karakter khusus, misalnya>
, menggunakan solusi ini:Dalam hal ini Anda ingin memulai dari baris 5 dan menandai setiap baris ke-4 setelahnya. Di GNU
sed
itu bisa diberikan sebagai alamat5~4
. Anda dapat menggunakan perintah ini:Maka Anda perlu menghapus baris baru, yang bisa dilakukan dengan
sed
loop:Ada cara yang lebih mudah untuk mengonversi baris baru ke beberapa karakter lain, misalnya dengan
tr
:Either way, menggabungkan keduanya memberi
(
sed
versi meninggalkan baris tambahan, sedangkantr
versi tidak)Setelah itu, Anda hanya perlu mengonversi karakter khusus yang Anda masukkan ke baris baru; lihat misalnya Konversikan file yang dibatasi-tab untuk menggunakan baris baru . Dalam hal ini, ubah
>
ke baris baru:The
y
perintah melakukan fungsi yang sama sepertitr
, mengubah satu karakter ke lain, tetapi Anda dapat menggunakans
perintah di sini sama baiknya. Dengans
, Anda harusg
beroperasi pada setiap pertandingan di baris (sed 's/>/\n/g'
).Daripada membuat dua file perantara, Anda bisa menggunakan pipa:
Jika spasi tambahan adalah masalah, Anda dapat menambahkan perintah lain untuk menghapusnya:
sumber
Demi "kelengkapan" inilah solusi bash murni:
Bekerja juga dengan spasi, dengan asumsi
IFS
diatur dengan benar (yang seharusnya secara default, AFAIK). Selain itu, saya pikir ini bahkan bisa menjadi skrip shell portabel dan berfungsi dengan shell POSIX yang kompatibel.sumber
$'
'
bentuk mengutip tidak diperlukan oleh POSIX. Sebagai contoh, didash
(yang menyediakansh
secara default di Ubuntu), menjalankanprintf '%s\n' $'a\tb'
hanya output$a\tb
. Itu tidak berarti ini tidak berguna; itu bekerja di bash. Namun, seperti halnya dengan beberapa solusi lain yang telah diposting orang, itu menghasilkan output yang tidak lengkap jika jumlah baris input bukan kelipatan empat. Juga, saya sarankan menggunakanread -r
, karena tidak ada alasan untuk berpikir perluasan backslash lolos dalam file input yang diinginkan di sini.printf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
Makro vim (direkam dengan q) dapat menerapkan operasi Anda, lalu melewati tiga baris. Kemudian, Anda hanya menjalankan makro itu n kali.
misalnya:
sumber
Karena Anda meminta solusi Gedit, sesuatu seperti ini seharusnya berfungsi:
Temukan:
Ubah dengan:
Pastikan kotak centang untuk ekspresi reguler ditandai.
Bagaimana itu bekerja:
Langkah pertama adalah menemukan serangkaian karakter kata, dengan \ w +, dan menangkap hasilnya dalam variabel \ 1 dengan membungkus tanda kurung di sekitar ekspresi:
Selanjutnya kita mencari serangkaian karakter akhir baris, \ r dan \ n, atau CR dan LF. Karena file berformat Windows menggunakan keduanya, kami membuat kelas karakter dengan membungkus kedua karakter ini dalam tanda kurung siku. Nilai tambah membuatnya mencari satu atau lebih karakter:
Akhirnya, kami mengulangi ini 3 kali lebih banyak, menyimpan setiap kata berikutnya dalam variabel \ 2, \ 3, dan \ 4. Ini membuat penggantian kami dengan ekspresi menjadi sederhana. Kami hanya perlu menempatkan karakter tab, \ t, dan karakter baris baru, \ n, di tempat yang sesuai untuk pemformatan yang Anda butuhkan.
sumber