如何将文本文件的每两行与 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 配对? [复制]的主要内容,如果未能解决你的问题,请参考以下文章