我有一个包含多列的测试文件。我想基于包含数值的第8列进行排序,然后获取前10%的行并将它们导出到新文件。
我更喜欢在bash中这样做。我知道我可以排序-k8 -n进行排序,但我无法完成第二项任务。
输出:
如果我的文本文件有1000行,我只想要前100行。
文件以制表符分隔。
谢谢!
答案 0 :(得分:2)
如果您可以将整个文件放入内存,那么您可以将输出发送到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行。