【问题标题】:bash: Reading first 'n' entries in a filebash:读取文件中的前“n”个条目
【发布时间】:2017-04-12 17:15:10
【问题描述】:

我有一系列非常大的单行空格分隔值文件。好像

0.993194 0.9684194 0.846847658 1.0 1.0 1.0 1.0 0.78499 0.54879564 0.9998545 ...

我想读取第一个副本的每个文件的前n个元素。

我可以将空格转换为新行 (cat file.txt | tr ' ' '\n' > file2.txt),然后逐行读取并将每一行保存在一个新文件 (head -n $n file2.txt | while read line; do echo $line >> file3.txt;done) 中,但这会非常慢。 (以上代码未测试)

如何有效地复制单行文件的前 n 个值?

注意:我可以复制前 n 个字符,即使这对应于未定义数量的值。

【问题讨论】:

  • cut 命令呢?
  • dd if=BigBoy bs=100 count=1 100 字节,或head -c 100 BigBoy

标签: bash performance file


【解决方案1】:

仅使用awk 并指定您想要的记录数怎么样?

awk -v n=5 '{for(i=1;i<=n;i++) print $i}' file
0.993194
0.9684194
0.846847658
1.0
1.0

(或)使用printf在同一行打印

awk -v n=5 '{for(i=1;i<=n;i++) printf "%s ",$i}' file
0.993194 0.9684194 0.846847658 1.0 1.0

(或)将 cutPOSIX 兼容选项一起使用,-d 用于设置分隔符,-f 1-5 用于字段 1 到 5。

cut -d' ' -f 1-5 file
0.993194 0.9684194 0.846847658 1.0 1.0

【讨论】:

    【解决方案2】:

    我会在 egrep 中使用精心设计的正则表达式,并带有 -o 标志,使其仅打印匹配的输出:

    egrep -e '^([0-9.]+[ ]*){3}' -o file.txt
    

    打印出来:

    0.993194 0.9684194 0.846847658
    

    由于 grep 是一个非常知名且经过高度优化的工具,因此它的性能非常好;我只是在一个 3 兆字节的文本文件上进行了尝试,它所用的时间并不比在 30 字节的文本文件上花费的时间长很多。

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 2018-11-29
      • 1970-01-01
      • 2012-12-31
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多