【问题标题】:Extracting columns from text file with different delimiters in Linux在 Linux 中从具有不同分隔符的文本文件中提取列
【发布时间】:2013-11-13 16:55:05
【问题描述】:

我有非常大的基因型文件,基本上不可能在 R 中打开,所以我尝试使用 linux 命令行提取感兴趣的行和列。行使用头/尾很简单,但我很难弄清楚如何处理列。

如果我尝试使用

提取(例如)第 100-105 个制表符或空格分隔的列
 cut -c100-105 myfile >outfile

如果每列中有多个字符的字符串,这显然是行不通的。有没有办法用适当的参数修改 cut 以便提取列中的整个字符串,其中列定义为空格或制表符(或任何其他字符)分隔?

【问题讨论】:

  • 哇。你的意思是-c100-105,不是-c100-1005,不是吗?你不想要一千零五列吗?到目前为止提交的两个答案使用 1005 !
  • 是的,我做到了,虽然原理还是一样。
  • 我不确定您所说的“如果每列中有多个字符的字符串显然将无法工作”是什么意思。

标签: linux


【解决方案1】:

如果命令应该同时使用制表符和空格作为分隔符,我会使用awk:

awk '{print $100,$101,$102,$103,$104,$105}' myfile > outfile

只要您只需要指定 5 个字段,只需键入它们就可以,对于更长的范围,您可以使用 for 循环:

awk '{for(i=100;i<=105;i++)print $i}' myfile > outfile

如果你想使用cut,你需要使用-f选项:

cut -f100-105 myfile > outfile

如果字段分隔符与TAB 不同,您需要使用-d 指定它:

cut -d' ' -f100-105 myfile > outfile

查看the man page 了解有关剪切命令的更多信息。

【讨论】:

  • 我认为这是不正确的。您必须有 -d$'\t' 选项卡。
  • @amc 它对我有用,至少对于 GNU cut。我添加了一个可以处理制表符和空格的 awk 命令。
  • 啊,好吧。我在 Mac 上,所以这可能会有所不同。谢谢。
【解决方案2】:

您可以使用 cut 与这样的分隔符:

带空格分隔符:

cut -d " " -f1-100,1000-1005 infile.csv > outfile.csv

带制表符分隔符:

cut -d$'\t' -f1-100,1000-1005 infile.csv > outfile.csv

我给了你可以提取区间列表的 cut 版本...

希望对你有帮助!

【讨论】:

  • 谢谢,我试试看。
  • +1 用于提及 -d$'\t' 语法。 (虽然不是必需的,因为TAB 是默认分隔符)
  • 您也可以使用awk --field-searator="\\t" '{print $1}' filename 语法。
  • 或简单的awk '{print $1}'(制表符是默认分隔符)
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 2019-10-01
相关资源
最近更新 更多