在 Linux 中使用 Column 命令的不同方法
您是否曾经处理过 CSV 文件并以结构化表格格式生成输出?最近,我正在对一个结构不正确的文件进行数据清理。每列之间有很多空格,我必须将其转换为 CSV 格式才能推送到数据库。清理并创建 CSV 格式的输出后,我的输出在视觉上不足以验证 CSV 文件中的数据完整性。这时候“Column”命令就派上用场了。
根据联机帮助页,column 命令“columnate links”。简而言之,列是一个简单的实用程序,可以根据源文件的结构将输出格式化为列格式(行和字段)。 column 命令是 util-linux 软件包的一部分。
这里需要注意的重要一点是 column 命令在基于 Debian 和基于 Rhel 的发行版中的行为不同。原因是基于 Debian 的发行版使用 bsdmainutils 中的“column”而不是 util-linux。 column 命令的上游版本比 bsdmainutils 软件包更新。查看错误报告以了解更多信息。
dpkg -S $(which column)
出于演示目的,我使用 CentOS 7 并将显示 Ubuntu 和 CentOS 7 之间的不同选项。要检查列版本,请运行以下命令。此命令还将显示 util-linux 软件包版本。
column --version # will not work in Debian/ubuntu
您还可以通过运行以下命令来检查 util-linux 的版本。
rpm -qa | grep -i util-linux # Redhat,Centos,Fedora,Amazon Linux
dpkg -l | grep -i util-linux # Ubuntu
在使用 column 命令之前,最好从手册页开始并探索其选项。
man column
以表格格式列出文件内容
column 命令可以通过将文件名作为参数与 -t
标志一起传递来创建表。我使用 /etc/passwd 作为输入文件。
column -t /etc/passwd
看到上图,您可能会认为这不是我们所期望的,并且输出可能看起来很奇怪。是的!你是对的。创建表格时,列考虑空格作为默认分隔符。可以通过传递自定义分隔符来覆盖此行为。
定制深度计
自定义分隔符为您提供了广泛的使用选项。要创建自定义分隔符,请使用 -s
标志,后跟分隔符。现在我们将使用“:”
作为分隔符来分割/etc/passwd文件。
column -s ":" -t /etc/passwd
看上图,表格的格式和结构都很好。从util-linux版本2.23开始,选项-s
已更改为不贪婪。
现在在 Ubuntu 中运行相同的命令,结果将是贪婪的。这是因为 Ubuntu 上的 column 命令 (bsdmainutils) 会将多个相邻单词视为单个单词。
column -s ":" -t /etc/passwd
要克服此行为,请使用 -n
标志。
column -t -s ":" -n /etc/passwd # Only on Debian/Ubuntu
忽略文件输出中的白色空行
当输入文件中有空行时,column 命令默认会忽略它。查看我的 CSV 格式的输入文件,我在每行之间添加了一个空行。现在让我们像之前一样使用此输入文件创建一个表。
column -t -s ";" dummy.txt
从上图中,您可以看到我的输入文件 dummy.txt 有空行,当我尝试创建表时,空行将被忽略。
注意:这是 column 命令的“bsdmainutils/util-linux”变体的默认行为。但是column (bsdmainutils) 可以选择通过传递-e
标志来覆盖此行为。
column -e -t -s "," dummy.txt # Only on Debian/Ubuntu
从上图中,您可以看到表格格式正确,并且空行没有被忽略。
文件输出分隔符
默认情况下,两个空格将用作输出分隔符。可以通过传递 -o
标志来覆盖此行为。 列 (bsdmainutils) 中将没有可用的输出分隔符选项。
column -t -s "," -o "||" dummy.txt # Only on Rhel based distro
将文件行转换为列
使用 -x
标志可以将行转换为列。此行为在 column 命令的 rhel 和 ubuntu 变体中是相同的。当您必须通过 awk 或 column 命令获取某个字段,然后将其转换为 CSV 文件的标题时,这是一个非常有用的功能。
column -x fillcols.txt
当您运行 column 命令而不使用任何标志时,行为将与传递 -x
标志相同。
查找列大小
column 使用环境变量 ($COLUMNS)
来查找终端的大小,并根据大小使用 echo 命令,表格大小将显示在终端中。
echo $COLUMNS
看看下面的图片。最初,我调整了终端大小,将 $COLUMNS
的大小设置为 60 并运行了 column 命令。我再次调整了终端的大小,将 $COLUMNS
的大小设置为 114 并再次运行 column 命令。当我们调整终端大小时,您可以看到列打印表格的方式有所不同。
column -t -s ":" /etc/passwd | head 5
这就是本文的内容。如果您有任何反馈,请在评论部分提供。