2009-10-03 10 views
23

Za pomocą prostego skryptu bash wygenerować plik tekstowy z wieloma liniami takiego:Jak sparować co dwa wiersze pliku tekstowego z Bash?

192.168.1.1 
hostname1 
192.168.1.2 
hostname2 
192.168.1.3 
hostname3 

Teraz chcę sformatować ten plik więc wygląda to tak:

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

jak bym sformatować w ten sposób? Być może sed?

+1

dlaczego nie można wygenerować złożyć w pożądanym formacie, aby rozpocząć? – SilentGhost

Odpowiedz

28
$ sed '$!N;s/\n/ /' infile 
192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 
+0

Czy mógłbyś wyjaśnić, jak to się stało? – NawaMan

+0

dzięki. dokładnie to, co szukam. :) – fwaechter

+5

@NawaMan: Jeśli masz na myśli "jak to działa?" then: Jeśli nie (!), ostatnia linia ($), a następnie dodaj kolejną linię (N) i zastąp nową linię między nimi spacją (s/\ n//) i powtórz od następnego wiersza (który będzie 3, 5 itd.). –

30

Oto powłoki jedyną alternatywą:

while read first; do read second; echo "$first $second"; done 
+1

Ale powinieneś zawsze (http://wiki.bash-hackers.org/commands/builtin/read#read_without_-r) używać flagi '' -r'' z '' read''. –

+1

Czy linia 'done' musi być' done

13

Kocham prostotę tego rozwiązania

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

lub uczynienia go oddzielone przecinkiem zamiast przestrzeni oddzielonej

cat infile | paste -sd ',\n' 

i jeśli twój plik wejściowy ha d trzecia linia jak datownik

192.168.1.1 
hostname1 
14423289909 
192.168.1.2 
hostname2 
14423289910 
192.168.1.3 
hostname3 
14423289911 

wtedy jedyną zmianą jest dodanie innego miejsca w liście do separatora

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 14423289909 
192.168.1.2 hostname2 14423289910 
192.168.1.3 hostname3 14423289911 
+0

Jest to zwięzłe, łatwe do zrozumienia i bardzo skalowalne. Dzięki! – musiphil

Powiązane problemy