【问题标题】:How do I grab the first 10% of lines in a text file?如何获取文本文件中前 10% 的行?
【发布时间】:2016-09-20 15:59:54
【问题描述】:

我有一个包含多列的测试文件。我想根据包含数值的第 8 列进行排序,然后抓取前 10% 的行并将它们导出到一个新文件。

我更喜欢在 bash 中执行此操作。我知道我可以使用 sort -k8 -n 进行排序,但我一直无法完成第二个任务。

输出:

如果我的文本文件有 1000 行,我只想要前 100 行。

文件以制表符分隔。

谢谢!

【问题讨论】:

  • 你试过用谷歌搜索什么?似乎您需要使用搜索词“bash get first lines of file”、“bash count lines in a file”、“bash 除整数”
  • 如果您知道您需要的行数(目前为 100 行),那么为什么不简单地使用:head -n 100
  • 我已经尝试查看各种谷歌搜索。有很多方法可以抓取前 N 行,但我想要前 N % 的行。 @KristoMägi 这是一个例子,我的管道运行数百个样本并为每个样本调用“绑定站点”,并且数字总是有很大不同,这就是我试图获得前 10% 的原因。
  • 如果不提前知道总行数,则需要通读整个文件以确定它,然后才能计算其中的 10%。 sort 不提供该信息。
  • 是的,我知道我需要提前确定有多少行......使用wc -l 相当简单,我不知道该怎么做就是管道所有这些命令一起得到我正在寻找的输出。我没有成功。

标签: bash


【解决方案1】:

如果您可以将整个文件放入内存中,那么您可以将输出发送到 awk:

sort -nk8 file | awk '{ a[NR] = $0 } END { 
  for (i = 1; i <= NR / 10; ++i) print a[i] 
}'

每一行都保存在数组a 中,由行号索引。打印第一行NR / 10

如果你有 GNU awk,你甚至可以同时进行排序:

awk '{ a[NR] = $0 } END { 
  asort(a, b, "@val_num_asc"); for (i = 1; i <= NR / 10; ++i) print b[i] 
}' file

读取所有(未排序的)行后,asort 按数字升序排序。

另一种方法是将sort 的结果输出到文件中,然后使用如下内容:

head -n $(( $(wc -l < file) / 10 )) file

请记住,shell 算术仅是整数,因此如果您的文件中有 1009 行,则只会输出 100。

【讨论】:

  • 这两个都很完美,谢谢!我知道必须有一种方法可以将 wc -l / 10 公式传递给 head 选项,但我就是不知道怎么做。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2010-09-28
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
相关资源
最近更新 更多