如何将文本文件的每两行与 Bash 配对? [复制]

Posted

技术标签:

【中文标题】如何将文本文件的每两行与 Bash 配对? [复制]【英文标题】:How do I pair every two lines of a text file with Bash? [duplicate] 【发布时间】:2010-12-03 14:04:59 【问题描述】:

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

192.168.1.1
hostname1
192.168.1.2
hostname2
192.168.1.3
hostname3

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

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

我该如何重新格式化它?也许sed

【问题讨论】:

为什么不首先以理想的格式生成文件? 【参考方案1】:
$ sed '$!N;s/\n/ /' infile
192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

【讨论】:

请您解释一下它是怎么来的? @NawaMan:如果你的意思是“它是如何工作的?”然后:如果不是 (!) 最后一行 ($) 然后附加下一行 (N) 并用空格 (s/\n/ /) 替换它们之间的换行符并从下一行开始重复(这将是第三、第五等)。【参考方案2】:

这是一个仅外壳的替代方案:

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

【讨论】:

但是你应该 always 使用 -r 标志和 read done 行必须是done < somefile.txt 吗?【参考方案3】:

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

cat infile | paste -sd ' \n'

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

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

cat infile | paste -sd ',\n'

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

192.168.1.1
hostname1
14423289909
192.168.1.2
hostname2
14423289910
192.168.1.3
hostname3
14423289911

那么唯一的改变是在分隔符列表中添加另一个空格

cat infile | paste -sd '  \n'

192.168.1.1 hostname1 14423289909
192.168.1.2 hostname2 14423289910
192.168.1.3 hostname3 14423289911

【讨论】:

如果行本身有空格怎么办? @MihaiDanila 刚刚尝试过,没有任何变化,工作正常。

以上是关于如何将文本文件的每两行与 Bash 配对? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据框的行与组配对?

如何从命令行将每两行合并为一行?

如何使用函数迭代python中数据框的每两列?

如何实现用bash批量修改文件名

如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]

创建两行之和的新列,但每两行重复一次[重复]