您可以在没有 AWK 的情况下轻松做到这一点:
$ sort -nk 2 input.txt | head -10 > output.txt
它对输入文件进行排序并打印前 10 行(第 2 列中的最低值)。如果您的输入文件特别大,这可能不适合。这个sort 可能使用了 O(N log N) 排序算法(对于 N 行输入)。
如果您只想要最低限度,AWK 中的解决方案将是单线。在这种情况下有点棘手,因为您必须保持多个最低值。试试这样的:
lowest.awk
#!/usr/bin/awk -f
BEGIN{if (X=="") X=10; s=0}
{ # insert new value in order
for (i=0; i<s && $2>a[i]; ++i);
if (s==X && i==s) next
for (j=s; j>i; --j) {
a[j] = a[j-1]
b[j] = b[j-1]
}
a[i] = $2
b[i] = $0
if (s<X) s++
}
END{ # print stored lines
for (i=0; i<s; ++i)
print b[i]
}
在命令行上运行:
$ awk -f lowest.awk infile.txt > outfile.txt
您可以使用-v X=10 指定要从命令行打印的最低值的数量X:
$ awk -v X=10 -f lowest.awk infile.txt > outfile.txt
但 10 是默认值。
这会将每个值(在第 2 列中)与数组 a 的每个元素进行比较,并在需要的地方插入新值。数组b 存储要在末尾打印的整行 ($0)。 a 和 b 的(使用)大小是 s。
通常,您应该使用 for (i in a) 之类的内容遍历数组中的条目,但在这种情况下,a[s] 处有一个额外条目,在打印结果时必须忽略它,因此采用 for (i=0; i<s; ++i) 格式在END 块中。
在最坏的情况下,每个 N 个值都会与 a 中的 X 个值进行比较。所以这是 O(XN),这是对 O(N log N) sort 版本的改进。此外,它需要更少的内存,因为您只在内存中存储 O(X) 个值而不是所有 N 行。
请注意,这通过插入来维护顺序。在 X=N 的地方,您保留所有值并按顺序列出它们——换句话说就是排序。当 X 接近 N,O(XN) 公式接近 O(N2) >,这是插入排序算法的复杂度。所以这个 AWK 版本只比基于 O(N log N) 排序的方法更有效,其中 X 远小于 N.