Linux上如何加入线路
在命令行上处理文本时,有时将多行连接在一起很有用。我们的 Linux 系统为我们提供了多种工具来简化这项任务,而不是遍历文本文件并手动将行移至同一行。日志文件就是一个很好的文本示例,文本通常分为多行,有时将一些行连接在一起更容易可视化数据。在本教程中,我们将向您展示在 Linux 系统上将文件行连接在一起的几种方法。
在本教程中您将学习:
如何使用各种 Linux 工具连接文件行
如何在 Linux 中加入线路 – 各种方法
作为示例,我们将使用包含以下文本的文件。这只是为了说明我们如何使用下面所示的各种方法将三条线组合成一条连贯线。
$ cat myfile.txt
Linux is
the best
operating system
注意
如果您的数据分布在多个文件中,则可以使用连接命令组合所有文本。虽然 join
命令提供了类似的功能,但这与我们下面将要处理的场景略有不同,因为我们的所有行都已包含在同一个文件中。
paste
命令可以说是完成这项工作最简单的工具,因此我们将首先介绍它。它通常默认安装在所有主要 Linux 发行版上。我们将使用-s
和-d
选项按行合并数据,并分别设置自定义分隔符。然后,我们使用' '
指定空格字符作为分隔符,最后输入输入文件的路径。$ paste -sd ' ' myfile.txt Linux is the best operating system
根据您的用例,您可能需要设置不同的分隔字符,例如逗号:
$ paste -sd ',' myfile.txt Linux is,the best,operating system
我们可以使用的下一个方法是 Bash shell 中内置的 readarray 函数。这种方法的优点是我们不需要任何额外的工具来完成这项工作。
此方法的工作原理是将输入文件的每一行加载到一个数组中(在此示例中名为
myarray
)。然后,我们将 IFS 变量设置为空格(您可以将其更改为任何字符以满足您的需要),该变量向多个 Bash 工具指示分隔符需要是什么。最后,我们回显
数组的所有值。$ readarray -t myarray < myfile.txt; IFS=' '; echo "${myarray[*]}" Linux is the best operating system
请注意,
readarray
的-t
选项将在将值加载到数组之前删除文件中的所有换行符。awk 是一个非常通用的实用程序,也可用于组合每行的数据。
$ awk 'BEGIN{ORS=" "}1' myfile.txt Linux is the best operating system
在本例中,我们将 ORS 值设置为空格字符,以便将文本输出为一个连贯的句子。但是,在其他情况下,您可以按所需的任何值(例如逗号)分隔行:
$ awk 'BEGIN{ORS=","}1' myfile.txt Linux is,the best,operating system
tr
命令也是一个可以非常简单地完成连接线工作的工具。这里我们指定要使用'\n'
组合每个新行上的所有数据,然后指定空格字符' '
作为分隔符。$ tr '\n' ' ' < myfile.txt Linux is the best operating system
现在让我们尝试用逗号连接每一行:
$ tr '\n' ',' < myfile.txt Linux is,the best,operating system
您是否见过 sed 无法处理的文本操作任务?我们也没有。在此示例中,我们将使用
-z
选项将输入文件视为单行,然后将每个换行符(由\n
表示)替换为空间字符。$ sed -z 's/\n/ /g' myfile.txt Linux is the best operating system
或者,如果您想连接行并用其他字符(例如逗号)分隔:
$ sed -z 's/\n/,/g' myfile.txt Linux is,the best,operating system
由于
-z
选项仅在较新版本的sed
中可用,因此这里是另一个选项,它依赖于xargs
将所有行组合成一个单行,然后将处理交给sed
:$ xargs < myfile.txt | sed -e 's/ / /g' Linux is the best operating system
结束语
在本教程中,我们了解了如何在 Linux 系统上将文件的多行合并为一行。与 Linux 中的大多数事情一样,有很多工具可以完成这项工作,也有很多方法可以完成任务。在大多数情况下,它们的工作原理大致相同,您可以使用您认为最适合您情况的任何一种。我们还了解了如何使用各种不同的字段分隔符和定界字符来使命令适应不同的场景。