我不确定如何忽略此处丢失的数据。
我的;
分隔的文件看起来像(用空格写它以便可读):
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
答案 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]]}}
在处理结束时,只需根据索引值对数组进行排序,然后以相反的顺序打印即可。