如何从 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 文件中提取第一列?的主要内容,如果未能解决你的问题,请参考以下文章