一段时间以来,我一直试图弄清楚如何使用 Linux 命令对日志文件(下面粘贴的格式)进行排序,但我就是无法让它工作。该文件的设置如下;
columnA | colB | colC | colD
name_1| data | 1 | data
name_1| data | 2 | data
name_1| data | 3 | data
name_2| data | 1 | data
name_2| data | 2 | data
我希望有一个文件,其中 A 列中的每个名称仅包含一个条目,基于 C 列中的最高值以及 colC 中具有最高值的行中其他列的相应数据。
如果有人知道任何命令或管道,将不胜感激。
谢谢
答案1
$ awk -F'|' '
NR==1 { header=$0 };
NR>1 && ($3 > colC[$1]) { colC[$1] = $3 ; line[$1] = $0};
END {
print header;
for (i in line) { print line[i] }
}' file.log
columnA | colB | colC | colD
name_1| data | 3 | data
name_2| data | 2 | data
此脚本使用|
字段分隔符awk
将第一行保存在变量 中header
,然后使用数组colC
保存 A 列的每个值 ( $1
) 以及 C 列中看到的最高值 ($3)。该数组line
还用于存储整个匹配的输入行 ( $0
)。
最后,当所有输入都被读取和处理后,它会打印每个保存的行。输出可能需要排序,因为关联数组不按任何给定顺序存储 - 将输出通过管道传输到sort
.根据输入文件的不同,标题行最终可能会被排序到输出的中间或末尾...如果是这种情况,最好不要在脚本中保存或打印它,awk
而是在脚本中打印它。运行 awk 脚本的 shell 脚本。
笔记:有多种方法可以优化此算法,我选择优化可读性和简单性。除非您的输入文件长达数百万或数十亿行,否则性能和内存消耗不太可能成为值得优化的问题。