44

With a simple bash script I generate a text file with many lines like this:

192.168.1.1
hostname1
192.168.1.2
hostname2
192.168.1.3
hostname3

Now I want to reformat this file so it looks like this:

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

How would I reformat it this way? Perhaps sed?

icktoofay
  • 122,243
  • 18
  • 242
  • 228
fwaechter
  • 835
  • 3
  • 10
  • 19

3 Answers3

54
$ sed '$!N;s/\n/ /' infile
192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3
Tim
  • 903
  • 7
  • 11
  • 1
    Would you please explain how it come to be? – NawaMan Oct 03 '09 at 14:57
  • 12
    @NawaMan: If you mean "how does it work?" then: If not (!) the last line ($) then append the next line (N) and replace the newline between them with a space (s/\n/ /) and repeat starting with the next line (which will be the 3rd, 5th, etc.). – Dennis Williamson Oct 03 '09 at 17:07
38

Here's a shell-only alternative:

while read first; do read second; echo "$first $second"; done
Jukka Matilainen
  • 8,235
  • 1
  • 23
  • 17
37

I love the simplicity of this solution

cat infile | paste -sd ' \n'

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

or make it comma separated instead of space separated

cat infile | paste -sd ',\n'

and if your input file had a third line like timestamp

192.168.1.1
hostname1
14423289909
192.168.1.2
hostname2
14423289910
192.168.1.3
hostname3
14423289911

then the only change is to add another space in to the delimiter list

cat infile | paste -sd '  \n'

192.168.1.1 hostname1 14423289909
192.168.1.2 hostname2 14423289910
192.168.1.3 hostname3 14423289911
rob
  • 7,676
  • 8
  • 56
  • 67