Bagaimana cara menggabungkan semua baris dalam file teks menjadi satu baris?

28

Saya ingin mendapatkan semua baris dalam teks menjadi satu baris. Saya seorang pemula dalam pengkodean mencoba untuk belajar dengan melakukan. Saya telah menghabiskan empat jam mencoba menyelesaikan masalah ini. Saya tahu ada solusi sederhana untuk masalah ini. Inilah yang saya coba.

sed -e 'N; s / \ n //' myfile.txt #Tidak ada apa-apa

sed -e: a -e N -e 's / \ n / /' -e ta myfile.txt #output semua kacau dan saya tidak bisa membuat kepala atau ekor sintaksis

cat myfile.txt | tr -d '\ n'> myfile.txt # Menghapus semua baris

Ini file teksnya:

500212
262578-4-4
23200
LABORATORIUM GRIFFITH LTD
LABORATORIUM GRIFFITH
DUNLIN COUNTY COUNTY SELATAN
KANTOR
KANTOR (INDUSTRI)
Daftar Rateable
2 Kawasan Industri Pineview
Jalan Firhouse
Knocklyon
31 Des 2007
01 Jan 2008 "   

Saya tidak tahu di mana kesalahan saya ....

John
sumber

Jawaban:

31

trseperti yang Anda gunakan itu harus berfungsi dan yang paling sederhana - Anda hanya perlu meng-output ke file lain . Jika Anda menggunakan file input sebagai output, hasilnya adalah file kosong seperti yang Anda amati;

cat myfile.txt | tr -d '\ n'> oneline.txt

Anda perlu mengingat beberapa editor mengakhiri satu baris dengan \r\n. Untuk itu, gunakan

cat myfile | tr -d '\r\n'
ish
sumber
Terima kasih atas bantuan Anda tetapi masih tidak berfungsi. Saya tahu itu saomething dasar dan sederhana. Perintah yang Anda berikan menghapus semua baris. Saya akan memposting file 500212 262578-4-4 23200 LABORATORIUM GRIFFITH LTD LABORATORIUM GRIFFITH DUBLIN SELATAN KANTOR KANTOR DUBLIN KANTOR (INDUSTRI) Daftar Harga 2 Pineview Industrial Estate Firhouse Road Knocklyon 31 Des 2007 01 Jan 2008
John
@ Jooh: Apa hasil atau kesalahannya?
ish
Saya akan memposting dengan mengedit jawaban saya. Setelah saya menggunakan perintah file itu kosong. Itu terlihat seperti ini di terminal "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt". Terima kasih lagi.
John
@ John: Anda tidak dapat menggunakan nama file output yang sama !! (Lihat jawaban). Silakan cobacat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish
1
Cara yang lebih baik untuk melakukan ini adalah tr -d '\n' <input.txt > output.txt- yang menghindari penggunaan kucing yang tidak berguna, dan menggunakan satu pipa yang tidak perlu.
evilsoup
8

Ini dia. Ini solusi lain dan mudah sederhana.

echo $(cat Input.txt) > Output.txt
αғsнιη
sumber
2
saya tidak percaya ini berhasil, luar biasa
mchid
echo `cat Input.txt` > Output.txt bekerja juga, hanya varian lain
raider33
Jika ada lebih dari SATU spasi putih (spasi, tab, baris baru, dan sebagainya) dalam satu divisi, mereka akan diganti oleh spasi.
iBug
Ini adalah solusi yang bagus, tetapi di komputer saya, saya merasa perlu sekitar tiga kali lebih lama untuk bekerja sebagai trsolusinya.
LS
4

METODE SEDERHANA

Metode lain menggunakan awk,

cat myfile.txt | awk '{print}' ORS=''

Keluaran:

500212262578-4-423200LABORATORIUM KEAHLIAN LTDLABORATORIUM KEAHLIAN KERJA DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) Daftar Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 Des 200701 Jan 2008 "

catatan:

ORS = '' -> Ini adalah pemisah bidang Anda, Anda dapat memiliki karakter di antara tanda kutip tunggal sebagai pemisah bidang. Dengan menggunakan metode awk ini kita dapat memasukkan spasi dan semua karakter.

Semoga ini bisa membantu!

MSArun
sumber
1
ORS adalah Pemisah Catatan Output. OFS adalah Pemisah Bidang Output. Lihat thegeekstuff.com/2010/01/… atauman awk
Penatua Geek
3

Tidak perlu menempatkan label di :aluar instruksi utama, begitu juga -eopsi yang diperlukan; akhirnya, /$/ini berlebihan (setiap baris memiliki karakter EOL).

Memperbaiki jawaban lain, satu mendapat

sed -i ':a; N; s/\n/ /; ta' file

Yang lebih jelas jika dituliskan sebagai berikut,

sed -i ':a
        N
        s/\n/ /
        ta' file

Perintahnya bekerja sebagai berikut:

  1. N menambahkan baris berikutnya ke ruang pola (multiline), yang sudah berisi baris saat ini;
  2. s/\n/ /mengganti karakter baris baru yang \ndihasilkan oleh Ndengan spasi ;
  3. tapergi ke baris skrip mengikuti label :a selama substitusi pada langkah 2 berhasil , yaitu jika substitusi terjadi, eksekusi melompat ke langkah 1 tanpa "memukul" akhir skrip, yaitu tanpa membaca baris input lain.

Perhatikan yang berikut ini;

  • sedmembaca baris file input satu per satu secara berurutan, mulai dari baris 1 ;
  • :a hanyalah sebuah label, bukan perintah yang harus dieksekusi;
  • N pada prinsipnya dieksekusi pada baris apa pun, tetapi
  • s/\n/ /(pada prinsipnya dieksekusi pada baris apa pun) berhasil pada baris apa pun tetapi yang terakhir , jadi
  • tamembuat akhir skrip dapat dijangkau hanya ketika baris input terakhir dibaca (satu-satunya baris yang sgagal), jadi
  • tidak ada baris input lebih lanjut dibaca ke dalam ruang pola setelah yang pertama dibaca ke dalamnya, kecuali yang terakhir dibaca, tetapi kemudian tidak ada baris lebih lanjut untuk dibaca, dan yang implisitp perintah dieksekusi.

Jadi skrip pada dasarnya membaca di baris pertama input dan terus menambahkan baris berikut satu per satu, setiap kali mengganti baris baru dengan spasi; setelah baris terakhir ditambahkan (dan \ndiubah dalam spasi), Ntidak dapat menambahkan baris apa pun, sgagal, tadilewati, akhir skrip tercapai, dan ppernyataan bidak tersirat dieksekusi pada ruang pola 1 baris looong saat ini .

The -ipilihan pengganti file input filedengan ruang pola 1-line secara keseluruhan.

Enrico Maria De Angelis
sumber
2

GEDIT:

Cari dan ganti \ndengan spasi ''.
Anda bisa mendapatkan jendela ganti dengan membuka 'Cari' -> 'Ganti'
atau melalui pintasan keybpard Ctrl+H

Lihat tangkapan layar di bawah ini:

Teks asli Anda ada pada baris 1-14.
Hasilnya ada di saluran 16.

masukkan deskripsi gambar di sini

Parto
sumber
0

Saya pikir Anda hanya lupa bahwa Anda perlu memberitahu sed untuk mengarahkan kembali output filefile Anda ke hasil yang diinginkan, filefile.txt. Hal ini tampaknya menjadi perintah yang Anda butuhkan, tetapi hanya jika file Anda mencoba untuk menggabungkan tidak terlalu besar untuk buffer sed ini: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Kredit ke forum lain di sini , di mana mereka mendiskusikan kemampuan sed. Saya telah menguji perintah dan itu berhasil untuk saya.


sumber
1
Sebenarnya, sed dengan -isaklar akan memodifikasi inline file asli , jadi tidak perlu untuk output ke file lain. Berhati-hatilah!
ish
Saya mencoba sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 Jan 2008 Estate Industri sed -i: a -e N -e 's / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: tidak dapat menemukan label untuk lompat ke a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to ' sed -e: a -e N -i 's / \ n / /' -e ta reval_details .asp? Pno = 500214.txt sed: tidak dapat membaca s / \ n / /: Tidak ada file atau direktori seperti itu #Setiap gagasan.
John
@Mik Saya masih belum beruntung tetapi terima kasih atas jawabannya.
John
Saya menyalin dan menempelkan teks Anda ke dalam editor teks dan menyimpan file kemudian menggunakan perintah sed saya dan itu membuat semuanya muncul pada satu baris ketika dibuka di nano; namun jika Anda membuka file menggunakan cat di terminal itu akan dibungkus dan tidak tampak hanya satu baris, jadi mungkin itulah yang terjadi. Juga, Anda tidak perlu 'sebelum sed dan saya pikir Anda telah menambahkan beberapa elemen yang tidak perlu ke perintah di atas, jadi coba sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt Garisnya sangat panjang sehingga akan tampak terbungkus di layar, kecuali Anda memiliki monitor 30+ inci!
@Mik Ceria untuk posting ini. Saya mengetik data saya ke dalam editor teks yang disimpan dan menjalankan 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' dan berhasil. sempurna. Haleluya. Saya kemudian mengetik 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' dan setiap baris selain dari yang pertama memiliki ruang ditambahkan ke awal baris. Saya menghargai upaya yang Anda lakukan, tetapi saya pikir saya akan beralih ke oktaf dan mencoba dan memproses data di sana.
John
0

Solusi bash murni:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
Evilsoup
sumber
0

Jika itu saya, saya hanya akan membukanya dalam vim dan tekan Shift+ Jbeberapa kali.

thomasrutter
sumber
0
vim <your_file>

Ketik dalam vim dan tekan Enter:

:% s/\n/ /g
Anatoly
sumber
0

Pendekatan python:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
Sergiy Kolodyazhnyy
sumber