如何将文本文件的每两行与Bash配对?

fwa*_*ter 36 bash sed text-files

使用简单的bash脚本,我生成一个包含许多行的文本文件,如下所示:

192.168.1.1
hostname1
192.168.1.2
hostname2
192.168.1.3
hostname3
Run Code Online (Sandbox Code Playgroud)

现在我想重新格式化这个文件,看起来像这样:

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3
Run Code Online (Sandbox Code Playgroud)

我将如何以这种方式重新格式化?也许sed吧?

Tim*_*Tim 44

$ sed '$!N;s/\n/ /' infile
192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3
Run Code Online (Sandbox Code Playgroud)

  • @NawaMan:如果你的意思是"它是如何运作的?" 然后:如果不是(!)最后一行($)然后追加下一行(N)并用空格(s/\n//)替换它们之间的换行符并从下一行开始重复(这将是3号,5号等). (9认同)

Juk*_*nen 35

这是一个仅限shell的替代方案:

while read first; do read second; echo "$first $second"; done
Run Code Online (Sandbox Code Playgroud)

  • 但你应该[总是](http://wiki.bash-hackers.org/commands/builtin/read#read_without_-r)使用“-r”标志和“read”。 (2认同)
  • `done`行需要`done <somefile.txt`吗? (2认同)

rob*_*rob 28

我喜欢这个解决方案的简单性

cat infile | paste -sd ' \n'

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3
Run Code Online (Sandbox Code Playgroud)

或者用逗号分隔而不是空格分隔

cat infile | paste -sd ',\n'
Run Code Online (Sandbox Code Playgroud)

如果您的输入文件有第三行,如时间戳

192.168.1.1
hostname1
14423289909
192.168.1.2
hostname2
14423289910
192.168.1.3
hostname3
14423289911
Run Code Online (Sandbox Code Playgroud)

然后唯一的变化是在分隔符列表中添加另一个空格

cat infile | paste -sd '  \n'

192.168.1.1 hostname1 14423289909
192.168.1.2 hostname2 14423289910
192.168.1.3 hostname3 14423289911
Run Code Online (Sandbox Code Playgroud)