Jak połączyć wszystkie linie w pliku tekstowym w jedną linię?

28

Chcę zebrać wszystkie wiersze tekstu w jeden wiersz. Jestem początkującym programistą, który stara się uczyć poprzez działanie. Spędziłem cztery godziny, próbując rozwiązać ten problem. Wiem, że istnieje proste rozwiązanie tego problemu. Oto, czego próbowałem.

sed -e 'N; s / \ n //' mój_plik.txt # Nic nie robi

sed -e: a -e N -e 's / \ n / /' -e ta myfile.txt #output wszystkie pomieszane i nie mogę zrobić głowy ani ogona składni

cat myfile.txt | tr -d '\ n'> mój_plik.txt # Usuwa wszystkie linie

Oto plik tekstowy:

500212
262578–4–4
23200
GRIFFITH LABORATORIES LTD
LABORATORIA GRIFFITH
RADA RADY POŁUDNIOWEJ DUBLINU
GABINET
BIURO (PRZEMYSŁOWE)
Lista podlegająca ocenie
2 Pineview Industrial Estate
Firhouse Road
Knocklyon
31 grudnia 2007 r
01 sty 2008 ”   

Nie mogę zrozumieć, gdzie popełniłem błąd…

Jan
źródło

Odpowiedzi:

31

trtak jak używałeś, powinien działać i jest najprostszy - wystarczy wyprowadzić plik do innego pliku . Jeśli użyjesz pliku wejściowego jako wyniku, wynikiem będzie pusty plik, jak zaobserwowałeś;

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

Musisz pamiętać, że niektórzy redaktorzy kończą wiersz \r\n. W takim przypadku użyj

cat myfile | tr -d '\r\n'
ish
źródło
Dziękuję za pomoc, ale nadal nie działa. Wiem, że to proste i proste. Wydane polecenie usunęło wszystkie wiersze. Zamierzam opublikować plik 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES SOUTH DUBLIN COUNTY OFFICE OFFICE OFFICE (INDUSTRIAL) Lista Rateable 2 Pineview Industrial Estate Firhouse Road Knocklyon 31 grudnia 2007 01 stycznia 2008
John
@JOhn: Jaki jest wynik lub błąd?
ish
Zamierzałem pisać, edytując swoją odpowiedź. Po użyciu polecenia plik był pusty. Wyglądało to tak w terminalu „cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt”. Dzięki jeszcze raz.
Jan
@John: Nie możesz użyć tej samej nazwy pliku wyjściowego !! (Zobacz odpowiedź). Spróbujcat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
owski
1
Lepszym sposobem na zrobienie tego byłoby tr -d '\n' <input.txt > output.txtuniknięcie bezużytecznego korzystania z kota i użycie jednej mniej niepotrzebnej rury.
evilsoup
8

Oto jest To kolejne rozwiązanie i proste łatwe.

echo $(cat Input.txt) > Output.txt
αғsнιη
źródło
2
nie mogę uwierzyć, że to zadziałało, niesamowite
mchid
echo `cat Input.txt` > Output.txt działa też, po prostu inny wariant
raider33
Jeśli w jednym dziale znajduje się więcej niż JEDNA biała spacja (spacja, tabulator, nowa linia itd.), Zostaną one zastąpione spacją.
iBug
To fajne rozwiązanie, ale na moim komputerze praca trwa około trzy razy dłużej niż trrozwiązanie.
LS
3

PROSTA METODA

Inna metoda wykorzystująca awk,

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

Wydajność:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) Lista Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 grudnia 200701 sty 2008 "

Uwaga:

ORS = '' -> To jest twój separator pól, możesz umieszczać dowolne znaki pomiędzy pojedynczymi cudzysłowami jako separator pól. Za pomocą tej metody awk możemy uwzględnić spacje i wszystkie znaki.

Mam nadzieję, że to może pomóc!

MSArun
źródło
1
ORS jest separatorem rekordów wyjściowych. OFS jest separatorem pól wyjściowych. Zobacz thegeekstuff.com/2010/01/… lubman awk
Elder Geek
3

Nie ma potrzeby umieszczania etykiety :apoza główną instrukcją, nie jest też -epotrzebna opcja; wreszcie /$/jest zbędny (każda linia ma znak EOL).

Ulepszanie innych odpowiedzi

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

Które jest jaśniejsze, jeśli jest napisane w następujący sposób,

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

Polecenie działa w następujący sposób:

  1. N dołącza następny wiersz do przestrzeni wzorów (wielowierszowej), która już zawiera bieżącą linię;
  2. s/\n/ /zamień \nwygenerowany znak nowej linii Nspacją ;
  3. taprzechodzi do wiersza skryptu następującego po etykiecie, :a o ile zastąpienie w kroku 2 zakończyło się powodzeniem , tj. jeśli wystąpiło zastąpienie, wykonanie przeskakuje do kroku 1 bez „uderzenia” w koniec skryptu, tj. bez odczytu innej linii wprowadzania.

Zwrócić uwagę na następujące;

  • sedczyta wiersze z jednego pliku wejściowego przez jeden w kolejności, zaczynając od 1 linii ;
  • :a to tylko etykieta, a nie polecenie do wykonania;
  • N jest, co do zasady, wykonywane na każdej linii, ale
  • s/\n/ /(zasadniczo wykonywany na każdej linii) jest sukces na każdej linii, ale ostatni , więc
  • tasprawia, że koniec osiągalny skryptu tylko wtedy, gdy ostatnia linia wejście jest czytane (jedyny wiersz, w którym snie powiedzie się), tak,
  • nie dalej linia wejściowa jest czytana do przestrzeni wzorca po 1. Jeden jest odczytywana do niego, chyba że ostatni jest odczytywany, ale to nie ma kolejna linia do zapoznania się i niejawna pkomenda jest wykonywana.

Zatem skrypt w zasadzie czyta pierwszy wiersz wejścia i dodaje kolejne wiersze jeden po drugim, za każdym razem zastępując nowy wiersz spacją; po dodaniu ostatniego wiersza (i \nzmianie spacji) Nnie może dołączyć żadnego wiersza, snie powiedzie się, tajest pomijany, osiągnięty jest koniec skryptu i pwykonywana jest domniemana instrukcja rint na bieżącym dłuższym 1-liniowym obszarze wzorców .

-iOpcja zastępuje plik wejściowy filez całej 1 linii przestrzeni wzorca.

Enrico Maria De Angelis
źródło
2

GEDIT:

Wyszukiwania i zamiany \nz przestrzeni „”.
Można uzyskać okno zastąpić przechodząc do „Szukaj” -> „Zamień”
lub poprzez keybpard skrót Ctrl+H

Zobacz zrzut ekranu poniżej:

Pierwotny tekst jest na liniach 1-14.
Wynik jest w linii 16.

wprowadź opis zdjęcia tutaj

Parto
źródło
0

Myślę, że po prostu zapomniałeś, że musisz powiedzieć sedowi, aby przekierował wyjście pliku yourfile.txt do pożądanego wyniku, newfile.txt. Wydaje się to być polecenie trzeba, ale tylko wtedy, gdy pliki próbują seryjnej nie są zbyt duże dla buforów SED: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Kredyt do innego forum tutaj , gdzie dyskutują sed-tych możliwości. Ja testowałem polecenie i pracował dla mnie.


źródło
1
Faktycznie, sed z -iprzełącznikiem modyfikuje oryginalnego pliku inline , więc nie ma potrzeby wyjścia do innego pliku. Bądź ostrożny!
owski
Próbowałem sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 sty 2008addustrial Estate sed -i: a -e N -e 's / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: nie można znaleźć etykiety dla skoku do 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 -e ta reval_details .asp? Pno = 500214.txt sed: nie można odczytać s / \ n / /: Brak takiego pliku lub katalogu # Wszelkie pomysły.
Jan
@Mik Wciąż nie miałem szczęścia, ale dziękuję za odpowiedź.
Jan
Skopiowałem i wkleiłem twój tekst do edytora tekstowego i zapisałem plik, a następnie użyłem mojej komendy sed, dzięki czemu wszystko pojawiło się w jednym wierszu po otwarciu w nano; jednak jeśli otworzysz plik za pomocą cat w terminalu, zostanie on zawinięty i nie będzie wyglądać jak jedna linia, więc być może tak się dzieje. Ponadto nie potrzebujesz znaku „przed sed” i myślę, że dodałeś inne niepotrzebne elementy do powyższego polecenia, więc spróbuj sed -e: a -e N -e 's / \ n / /' -e ta yourfile.txt> newfile.txt Linia jest tak długa, że ​​wydaje się być owinięta na ekranie, chyba że masz monitor o przekątnej 30 cali!
@Mik Pozdrawiam za post. Wpisałem moje dane do edytora tekstowego, który je zapisałem i uruchomiłem „sed -e: a -e N -e” s / \ n / / „-e ta abc.txt> abc1.txt” i zadziałało. doskonale. Alleluja. Następnie wpisałem „sed -e: a -e N -e” / \ n / / -e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt 'i każda linia oprócz pierwszej miała spacja dodana na początku wiersza. Doceniam włożony wysiłek, ale myślę, że przejdę do oktawy i spróbuję tam przetworzyć dane.
Jan
0

Rozwiązanie Pure Bash:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
zła
źródło
0

Gdybym to był ja, po prostu otworzę go w vimie i naciśnij Shift+ Jkilka razy.

thomasrutter
źródło
0
vim <your_file>

Wpisz w vimie i naciśnij Enter:

:% s/\n/ /g
Anatolij
źródło
0

Podejście 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
źródło