Linux:我想获取column3的前10条记录。该列缺少一些数据。我已经对文件进行了排序

时间:2019-02-15 05:37:30

标签: linux sorting

我不确定如何忽略此处丢失的数据。

我的;分隔的文件看起来像(用空格写它以便可读):

Col1  Col2  Col3  Col4  Col5
12    a     ?     ?     ?
1     b     ?     ?     ?
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9
and so on....

我想获取第3列的最大值的记录

Col1  Col2  Col3  Col4  Col5
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9

我以相反的顺序对column3上的文件进行了排序。不确定如何继续进行。

sort -t';' -k3 -r original.txt > newfile.txt 

2 个答案:

答案 0 :(得分:3)

关于命令行的一件很棒的事情是,您可以轻松地将最佳工具用于正确的应用程序,或者使用管道pascals_triangle <- function(x) { for (i in 1:x) { holder <- c() n <- i - 1 for (j in 1:i) { r <- j - 1 nCrlessone <- factorial(n)/(factorial(n-r)*factorial(r)) holder <- c(holder, nCrlessone) } print(holder) } } pascals_triangle(10) [1] 1 [1] 1 1 [1] 1 2 1 [1] 1 3 3 1 [1] 1 4 6 4 1 [1] 1 5 10 10 5 1 [1] 1 6 15 20 15 6 1 [1] 1 7 21 35 35 21 7 1 [1] 1 8 28 56 70 56 28 8 1 [1] 1 9 36 84 126 126 84 36 9 1 链接输出,或者通过创建诸如|之类的临时文件。

在这种情况下,使用newfile.txt是对数据进行排序的合适选择。排序后,您可以使用一个非常有效的解析数据sort的单独工具。

从已排序的awk开始,此newfile.txt操作将仅打印包含5个字段的行(假设您丢失的数据实际上丢失了,并且没有空的分隔符,例如您的行看起来像{{ 1}},而不是awk

45;c;

但是,在对空字段进行分隔的情况下(例如45;c;;;),并假设只有第3到第5列可能有丢失的数据,它将对此进行处理:

awk -F';' 'NF == 5 { print }' newfile.txt

请注意,由于要打印45;c;;;的默认行为,因此实际上不需要上述awk -F';' 'NF == 5 && $3 && $4 && $5 { print }' newfile.txt ,但在教学上要包括在内。

因此,从头到尾,您可以获得所需的结果,

awk

答案 1 :(得分:0)

您可以使用以下命令:

$ head -1 fileToSort; (sort -k3 -n -r <(tail -n +2 fileToSort) | head)
Col1  Col2  Col3  Col4  Col5
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9
1     b     ?     ?     ?
12    a     ?     ?     ?

fileToSort在哪里

 cat fileToSort 
Col1  Col2  Col3  Col4  Col5
12    a     ?     ?     ?
1     b     ?     ?     ?
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9

说明:

  • 如果您的字段分隔符为-t';',请使用;
  • <(tail -n +2 fileToSort)将排除输入文件的标题
  • 然后,您可以使用-n通过反向键和数字键通过第三个键对其进行排序
  • head将输出限制为前10条记录
  • head -1 fileToSort;将在打印前10条记录之前打印标题行

如果您需要awk解决方案:

awk 'NR==1;NF == 5 && $3~/^[0-9]+(\.[0-9]+)+$/ && $4~/^[0-9]+(\.[0-9]+)+$/ && $5~/^[0-9]+(\.[0-9]+)+$/{buff[$3]=$0}END{n=asorti(buff,out); for (i = n; i >= 1; i--){print buff[out[i]]}}' fileToSort 
Col1  Col2  Col3  Col4  Col5
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9

如果文件确实包含-F';'而不是空格,则可能需要在awk命令之后添加;。您的命令将变为:awk -F';' ...

  • NR==1;打印第一行
  • NF == 5 && $3~/^[0-9]+(\.[0-9]+)+$/ && $4~/^[0-9]+(\.[0-9]+)+$/ && $5~/^[0-9]+(\.[0-9]+)+$/检查是否有5个字段,并且最后3列的值是数字
  • {buff[$3]=$0}将每一行保存在以col3值索引的缓冲区中
  • END{n=asorti(buff,out); for (i = n; i >= 1; i--){print buff[out[i]]}}在处理结束时,只需根据索引值对数组进行排序,然后以相反的顺序打印即可。