如何从 tsv 文件中提取第一列?

Posted

技术标签:

【中文标题】如何从 tsv 文件中提取第一列?【英文标题】:How to extract the first column from a tsv file? 【发布时间】:2018-08-26 16:53:06 【问题描述】:

我有一个包含一些数据的文件,我只想将第一列用作脚本的标准输入,但我无法提取它。 我试过用这个

awk -F"\t" 'print $1' inputs.tsv

但它只显示第一列的第一个字母。我尝试了其他一些方法,但它要么显示整个文件,要么只显示第一列的第一个字母。

我的文件看起来像这样:

Harry_Potter    1
Lord_of_the_rings    10
Shameless    23
....

【问题讨论】:

您的输入看起来不像制表符分隔。发布预期结果 如果该脚本执行您所说的操作,那么您的输入文件中的控制字符会干扰输出。 awk 脚本是正确的。 【参考方案1】:

试试这个(最好依靠真正的csv 解析器...):

csvcut -c 1 -f $'\t' file

查看csvkit

输出:

Harry_Potter
Lord_of_the_rings
Shameless

注意:

正如@RomanPerekhrest 所说,您应该修复损坏的示例输入(我们看到了应该使用制表符的空格...)

【讨论】:

非常感谢您的编辑。我似乎对 -f 参数有疑问,我收到一条错误消息,指出该参数无法识别 您使用的是哪个外壳?试试bash【参考方案2】:

您可以使用在所有 Unix 和 Linux 系统上都可用的cut

cut -f1 inputs.tsv

您不需要指定-d 选项,因为制表符是默认分隔符。来自man cut

 -d delim
         Use delim as the field delimiter character instead of the tab character.

正如 Benjamin 所说,您的 awk 命令确实是正确的。 Shell 将文字 \t 作为参数传递,而 awk 将其解释为选项卡,而像 cut 这样的其他命令可能不会。

不知道为什么你只得到第一个字符作为输出。


你可能想看看这篇文章:

Difference between single and double quotes in Bash

【讨论】:

我认为您说"\t" 不会转换为标签是不正确的。 shell 不会在双引号中触及它,然后 awk does\t 解释为选项卡。此外,$'\t' 仅适用于 Bash。我很确定awk -F"\t" 'print $1' 是一种符合 POSIX 标准的打印每行第一个制表符分隔字段的方式。示例:awk --posix -F"\t" 'print $1' <<< $'1\t2' 谢谢@BenjaminW。为了纠正我。我已更新答案以包含您的解释。 @BenjaminW。是正确的,awk -F'\t' 很好,你不需要awk -F$'\t' 的 bashism。在这种情况下,单引号和双引号之间的区别也无关紧要。

以上是关于如何从 tsv 文件中提取第一列?的主要内容,如果未能解决你的问题,请参考以下文章

如何从字典中提取仅打印某些变量python

是否可以从第一列包含与其他文件名称匹配的标识符的文件中提取某些行?

如何从 300GB 文件中提取一列到另一个文件

matlab提取txt文件的第一列

如何提取 DataTables 中所选行的第一列?

如何让pandas停止跳过TSV文件中的第一个空白列?