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

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

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

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

我的文件看起来像这样:

Harry_Potter    1
Lord_of_the_rings    10
Shameless    23
....

【问题讨论】:

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

标签: awk sed cut


【解决方案1】:

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

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 这样的其他命令可能不会。

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


你可能想看看这篇文章:

【讨论】:

  • 我认为您说"\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。在这种情况下,单引号和双引号之间的区别也无关紧要。
猜你喜欢
  • 2018-02-21
  • 2014-10-20
  • 2016-01-24
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多