你有没有遇到过要处理CSV文件并以结构化的表格格式输出的情况?最近,我正在对一个结构不合理的文件进行数据清洗。它的每一列之间都有很多空格,我必须将它转换为CSV格式推送到数据库中。在清洗并创建CSV格式的输出后,我的输出并不能直观地验证CSV文件的数据完整性。这个时候,"Column "命令就给我派上了用场。
根据manpage的介绍,column命令是 "列化列表"。简单来说,column是一个简单的实用工具,它可以根据你的源文件的结构,将你的输出格式化为列格式(行和字段)。column命令是util-linux包的一部分。
需要注意的是,在基于Debian的发行版和基于Rhel的发行版中,column命令的表现是不同的。原因是基于 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页面开始探索它的选项。
$ man 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

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

从上图可以看到我的输入文件dummy.txt有空行,当我尝试创建一个表时,空行会被忽略。
注意:这是列命令的 "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标志,你可以将行转换为列,这种行为在rhel和ubuntu版本中都是一样的。这个行为在rhel和ubuntu版本的column命令中都是一样的。当你需要通过awk或column命令抓取某个字段,然后将其转换为CSV文件的头时,这是一个非常有用的功能。
$ column -x fillcols.txt

当你在不使用任何标志的情况下运行列命令时,其行为将与传递-x标志相同。
查找列的大小
该列使用环境变量($COLUMNS)找出终端的大小,并根据大小使用echo命令,在终端中显示表的大小。
$ echo $COLUMNS
看看下面的图片。首先,我调整了终端的大小,将$COLUMNS的大小设置为60,然后运行列命令。我再次调整终端的大小,将$COLUMNS的大小设置为114,然后再次运行列命令。你可以看到当我们调整终端大小时,列打印表的不同。
$ column -t -s ":" /etc/passwd | head 5

本文到此结束,希望对您有所帮助。
标签:
- Linux系统服务器
- Column命令