Bir metin dosyasındaki tüm satırları tek bir satırda nasıl birleştiririm?


28

Bir metindeki tüm satırları bir satıra almak istiyorum. Ben kodlamayı öğrenerek öğrenmeye çalışıyorum. Bu sorunu çözmek için dört saatimi harcadım. Bu sorunun basit bir çözümü olduğunu biliyorum. İşte denedim.

sed -e 'N; s / \ n //' myfile.txt # Hiçbir şey yapmaz

sed -e: a -e N -e '/ s / \ n / /' -e ta myfile.txt #output tüm berbat ve sözdizimi baş ne de kuyruk yapamam

kedi myfile.txt | tr -d '\ n'> myfile.txt # Tüm satırları siler

İşte metin dosyası:

500212
262578-4-4
23200
GRIFFITH LABORATUVARLARI LTD
GRIFFITH LABORATUVARLARI
GÜNEY DUBLIN ÜLKE KONSEYİ
OFİS
OFİS (ENDÜSTRİYEL)
Sıralanabilir Liste
2 Pineview Endüstriyel Sitesi
Firhouse Yolu
Knocklyon
31 Ara 2007
01 Ocak 2008 "   

Nerede yanlış yaptığımı anlayamıyorum ....

Yanıtlar:


31

trEğer kullanıldığı gibi olmalıdır çalışmak ve en basit - sadece gereken başka bir dosyaya çıktı . Girdi dosyasını çıktı olarak kullanırsanız, sonuç gözlemlediğiniz gibi boş bir dosyadır;

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

Bazı editörlerin bir satırı sonlandırdığını hatırlamanız gerekir \r\n. Bu durumda, kullan

cat myfile | tr -d '\r\n'

Yardımınız için teşekkürler ama hala çalışmıyor. Basit ve basit bir şey olduğunu biliyorum. Verdiğiniz komut tüm satırları siler. 500212 262578-4-4 23200 no'lu dosyayı yayınlayacağım 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATUVARLARI GÜNEY ŞUBE ÜLKE ÜLKE OFİS BÜROSU (ENDÜSTRİYEL) Liste Ratted 2 Pineview Industrial Estate Firhouse Road Knocklyon 31 Aralık 2007 01 Ocak 2008
John

@JOhn: Sonuç veya hata nedir?
ish

Cevabımı düzenleyerek gönderecektim. Komutu kullandıktan sonra dosya boştu. "Cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt" terminalinde buna benziyordu. Tekrar teşekkürler.
John

@John: Aynı çıktı dosya adını kullanamazsınız !! (cevaba bakınız). Lütfen denecat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
Bunu yapmanın daha iyi bir yolu, tr -d '\n' <input.txt > output.txtkedinin işe yaramaz kullanımını engelleyen ve daha az gereksiz bir boru kullanan şey olacaktır.
evilsoup

8

İşte burada. Başka bir çözüm ve basit kolay.

echo $(cat Input.txt) > Output.txt

2
Bunun işe yaradığına inanamıyorum, harika
mchid

echo `cat Input.txt` > Output.txt de çalışır, başka bir değişken
raider33

Tek bir bölmede birden fazla beyaz boşluk (boşluk, sekme, yeni satır vb.) Varsa, bunlar boşlukla değiştirilir.
iBug,

Bu güzel bir çözüm, ancak bilgisayarımda trçözümün çalışmasının yaklaşık üç kat sürdüğünü gördüm .
LS

3

BASİT YÖNTEM

Awk kullanan başka bir yöntem,

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

Çıktı:

500212262578-4-423200GRIFFITH LABORATUVAR LTD.ŞTİDİ

Not:

ORS = '' -> Bu, alan ayırıcınızdır, alan ayırıcı olarak tek tırnaklar arasında herhangi bir karaktere sahip olabilirsiniz. Bu awk yöntemini kullanarak boşlukları ve tüm karakterleri içerebilir.

Umarım bu yardımcı olabilir!


1
ORS, Çıkış Kayıt Ayırıcıdır. OFS, Çıkış Alanı Ayırıcıdır. Bkz thegeekstuff.com/2010/01/... veyaman awk
Elder Geek

3

Etiketi :aana talimatın dışına koymaya gerek yoktur , -egerekli olan seçenek de değildir; Sonunda, /$/gereksiz (her satır bir EOL karakterine sahiptir).

Diğer cevapları iyileştirmek, bir alır

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

Aşağıdaki gibi yazılırsa hangisi daha açıktır,

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

Komut aşağıdaki gibi çalışır:

  1. N sonraki satırı, halihazırdaki satırı içeren (çok satırlı) desen alanına ekler;
  2. s/\n/ /\ntarafından oluşturulan newline karakterini Nbir boşlukla değiştirmek ;
  3. taetiketi izleyen komut satırına gider :a 2. adımda ikame başarılı olduğu sürece , yani ikame gerçekleştiyse, yürütme, senaryonun sonunu "isabet" olmadan 1. adıma atlar yani olmadan girdi başka bir hattı okuma.

Aşağıdakilere dikkat et;

  • sedGiriş dosyasının satırlarını , ilk satırdan başlayarak sırayla okur ;
  • :a sadece bir etiket, çalıştırılacak bir komut değil;
  • N prensip olarak herhangi bir hat üzerinde yürütülür, ancak
  • s/\n/ /(prensip olarak herhangi bir hat üzerinde yürütülür) herhangi bir hat üzerinde başarılı olur , ancak sonuncusu ,
  • tabetiğin sonunu yalnızca girişin son satırı okunduğunda ( sbaşarısız olan tek satır ) ulaşılabilir kılar;
  • Sonuncusu okunmamışsa , ilk okunandan sonra desen alanına başka bir giriş satırı okunmaz , fakat sonra okunacak başka bir satır yoktur ve örtük komut yürütülür.p

Böylece senaryo temel olarak giriş satırının ilk satırını okur ve aşağıdaki satırları birer birer eklemeye devam eder; son satır eklendikten sonra (ve \nbir boşlukta değiştirildiyse), Nherhangi bir satır eklenemez, sbaşarısız olur, taatlanır, komut dosyasının sonuna ulaşılır ve zımni psatır ifadesi geçerli looong 1 satırlık desen alanında yürütülür .

-iOpsiyon girdi dosyasını yerine filebütün 1 satır desen alanı ile.


2

GEDIT:

Ara ve \n'' ile boşluk bırak.
Değiştirme penceresini 'Ara' -> 'Değiştir'
e giderek veya klavye kısayolu Ctrl+H

Aşağıdaki ekran görüntüsüne bakın:

Orijinal metniniz 1-14. Satırlarda
Sonuç, 16. hatta.

görüntü tanımını buraya girin




0

Sanırım dosya.txt dosyanızın çıktısını istediğiniz sonuç olan newfile.txt dosyasına yönlendirmek için sed'e söylemeniz gerektiğini unutmuşsunuzdur. Bu İhtiyacınız komut gibi görünen, ancak birleştirme çalıştığınız dosyalar en sed tampon için çok büyük değil yalnızca: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Kredi Burada başka forumda onlar yeteneklerini sed tartışıyor. Komutu test ettim ve bu benim için çalıştı.


1
Aslında sed ile -iorijinal dosya değiştirmek olacaktır anahtarı inline , bu nedenle başka bir dosyaya çıkışa gerek yoktur. Yine de dikkatli ol!
ish

Sed -e'yi denedim: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 Ocak 2008 endüstri Emlak sed -i: a -e N -e '/ / n / / '-e ta reval_details.asp? Pno = 500214.txt sed: 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 atlamak için etiket bulamıyor : a-e N-' s / \ n / / '-e ta reval_details .asp? Pno = 500214.txt sed: okunamıyor s / \ n / /: Böyle bir dosya veya dizin yok #Her fikir yok.
John,

@Mik Hala şansım olmadı ama cevap için teşekkürler.
John

Metninizi bir metin düzenleyiciye kopyalayıp yapıştırdım ve dosyayı kaydettim, sonra sed komutumu kullandım ve nano'da açıldığında tümünün bir satırda görünmesini sağladım; ancak dosyayı terminalde cat kullanarak açarsanız, paketlenecek ve sadece bir satır gibi görünmeyecektir, bu yüzden olan şey bu olabilir. Ayrıca, bir 'sed' ye ihtiyacınız yok ve bence yukarıdaki komuta bazı gereksiz unsurlar eklediniz, bu yüzden sed -e 'yi deneyin: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt Satır o kadar uzun ki 30+ inçlik bir ekrana sahip değilseniz, ekranda görünecek kadar uzun!

@Mik Yazı için Şerefe. Verilerimi bir metin editörüne yazdım ve 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' yazdı ve çalıştı. mükemmel bir şekilde. Hallelujah. Daha sonra 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' yazdım ve ilk satırın dışındaki her satır Satırın başına eklenen boşluk. Çaba gösterdiğiniz çabayı takdir ediyorum ama sanırım oktav'a geçip oradaki verileri deneyip işleme koyacağım.
John

0

Saf bash çözümü:

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

0

Benim yerimde olsaydım sadece vimde açıp birkaç kez Shift+ 'ya basardım J.


0
vim <your_file>

Vim yazıp Enter tuşuna basın:

:% s/\n/ /g

0

Python yaklaşımı:

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

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.