【问题标题】:Extracting columns from a file (more than 22354 columns)从文件中提取列(超过 22354 列)
【发布时间】:2015-10-15 05:08:50
【问题描述】:

我应该从一个有 150k 列的文件中提取大约 50k 列。我试过cut。但是cut只支持22354列。

列号在一个文件中,我应该从主文件中提取这些列。

文件如下所示:

    .001 .2 0 0 1 2.3456
    1 2 4.567 2.12 0 7
    1 2 1 2 0 1

删减的作品,但仅限于第一个 22354。

cut -d" " -f2,4 # 我在f 后面放了 50k 个数字。

可以将文件剪切三遍并粘贴在一起!我正在寻找更好的方法。

【问题讨论】:

  • 任何示例数据格式?
  • 文件内容是什么意思?
  • awkperl 似乎能够轻松处理如此大量的列。你试过awk吗?

标签: awk sed cut gawk


【解决方案1】:
awk -v "LastCol=50000" '{
   if (NF > LastCol){
      for( i = 1; i < LastCol; i++) printf "%s%s", $i, FS
      print $LastCol
      }
    else print
   }' File > File.crop

测试了 150K 列 (seq -s " " 150000) 并在这里工作

【讨论】:

    【解决方案2】:

    要绕过任何命令行长度限制(以及任何剪切限制),您可能希望使用awk -f 来代替。将您的列列表放入文件中:

    columnfile:
    {print [comma-separated list of your column numbers each preceded by "$"]}
    

    那么就:

    awk -f columnfile < [your input file]
    

    【讨论】:

    • ???问题出在 cut 限制上,而不是 awk 上,并且编写具有 50K 列前面有 $ 的命令行在代码中并不常见。
    • awk 第一次内存不足!
    • 在我的系统上 awk 真的是 mawk 1.3 我得到:awk: program limit exceeded: maximum number of fields size=32767
    【解决方案3】:

    您可以使用sed,我不确定它的限制是多少,但sed 可以轻松处理 150000 列,而且速度很快。在第一遍中,将所有字段分隔符切换为sed 的换行符,然后使用-n 选项抑制输出并使用sed 打印命令p 指定列范围。

    例如 seq -s " " 150000 &gt; myfile.txt

    sed -r 's/[ ]+/ /g;s/ /\n/g' myfile.txt | sed -n '55455,60000p;115000,125000p'

    Note: 不要忘记计算列数,因为现在列是行,您需要将之前的行号乘以列数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多