您是否曾经处理过 CSV 文件并以结构化表格格式生成输出?最近,我正在对一个结构不正确的文件进行数据清理。每列之间有很多空格,我必须将其转换为 CSV 格式才能推送到数据库。清理并创建 CSV 格式的输出后,我的输出在视觉上不足以验证 CSV 文件中的数据完整性。这时候“Column”命令就派上用场了。
根据联机帮助页,柱子命令 ”列列表”。简单来说,柱子是一个简单的实用程序,可以将您的输出格式化为柱子基于源文件结构的格式(行和字段)。这柱子命令是 util-linux 包的一部分。
这里需要注意的重要一点是柱子命令的行为有所不同和。原因是基于 Debian 的发行版使用“柱子“ 从bsdmainutils而不是 util-linux。上游版本柱子命令比bsdmainutils包裹。看看错误报告了解更多相关信息。
$ dpkg -S $(which column)

出于演示目的,我使用操作系统7并会显示之间的不同选项乌班图和操作系统7。要检查柱子版本运行以下命令。该命令还将显示实用程序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
使用前柱子命令的一个很好的起点是手册页并探索其选项。
$ man column
以表格格式列出文件内容
这柱子命令可以作为一个论点以及-t旗帜。我正在使用/etc/密码作为输入文件。
$ column -t /etc/passwd

看到上图,您可能会认为这不是我们所期望的,并且输出可能看起来很奇怪。是的!你是对的。专栏考虑空格作为默认分隔符创建表时。可以通过传递自定义分隔符来覆盖此行为。
定制深度计
自定义分隔符为您提供了广泛的使用选项。要创建自定义分隔符,请使用-s标志后跟一个分隔符。现在我们将使用“:”作为分割的分隔符/etc/密码文件。
$ column -s ":" -t /etc/passwd

看上图,表格的格式和结构都很好。从实用程序linux2.23版本选项-s已改为不贪心。
现在运行相同的命令乌班图结果将是贪婪的。这是因为柱子命令 (bsdmainutils) 在乌班图会将多个相邻单词视为单个单词。
$ column -s ":" -t /etc/passwd

为了克服这种行为,请使用-n旗帜。
$ column -t -s ":" -n /etc/passwd # Only on Debian/Ubuntu

忽略文件输出中的白色空行
当输入文件中有空行时,column 命令默认会忽略它。查看我的 CSV 格式的输入文件,我在每行之间添加了一个空行。现在让我们像之前一样使用此输入文件创建一个表。
$ column -t -s ";" dummy.txt

从上图中你可以看到我的输入文件虚拟.txt有空行,当我尝试创建表时,空行将被忽略。
笔记:这是“bsdmainutils/util-linux” 的变体柱子命令。但柱子(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 命令,然后将其转换为 CSV 文件的标题。
$ column -x fillcols.txt

当你运行柱子命令不使用任何标志的行为将与传递相同-x旗帜。
查找列大小
这柱子使用环境变量($COLUMNS)要找出您的终端的大小,并根据大小使用,表格大小将显示在终端中。
$ echo $COLUMNS
看看下面的图片。最初,我调整了终端的大小$COLUMNS大小设置为60并运行列命令。我再次调整了终端的大小$COLUMNS大小设置为114并再次运行列命令。当我们调整终端大小时,您可以看到列打印表格的方式有所不同。
$ column -t -s ":" /etc/passwd | head 5

这就是本文的内容。如果您有任何反馈,请在评论部分提供。
