如何获取CSV文本文件中特定字段的最大值?

时间:2016-01-11 22:00:18

标签: linux shell csv awk

我的文本文件示例中的每一行(CSV,逗号分隔)如下:

2016-01-10,23:56:07,10,71,47

可以看出,字段3,4和5是数字值。

对于每一行,我只想获得字段 3和4 最大值。类似的东西:

awk -F ',' '{print max($3,$4)}'

(可能不是真正的AWK语法,这个,但它是我能想到的最接近的。) 因此,对于上述行,结果数字将为“71”。

更多行的示例:

2016-01-10,23:53:07,6,99,41
2016-01-10,23:54:07,10,88,44
2016-01-10,23:55:07,31,71,46
2016-01-10,23:56:07,71,10,47

结果:

99
88
71
71

如何在 Linux shell 上完成? 我建议使用AWK,但任何其他解决方案都可以。

3 个答案:

答案 0 :(得分:6)

这个单行可能会有所帮助:

awk -F, '{print ($3>$4?$3:$4)}' file

答案 1 :(得分:2)

Just Bash:

while IFS=, read -r _ _ f3 f4 _; do echo "$(( f3 > f4 ? f3 : f4 ))"; done < infile

如果字段3和4可以包含非整数,则可以使用bc扩展,以支持浮点数(使得awk解决方案更易于理解):

while IFS=, read -r _ _ f3 f4 _; do
    bc -l <<< "if ($f3 > $f4) $f3 else $f4"
done < infile

else是GNU扩展,POSIX bc不支持。使用if ($f3 > $f4) $f3; if ($f4 >= $f3) $f4进行POSIX一致性。

答案 2 :(得分:0)

如果您需要更多控制格式或引用cvs字段,Python是一个不错的选择:

$ python -c "
> import csv, fileinput
> for line in csv.reader(fileinput.input()): 
>    print max(map(float, line[2:4]))
> " /tmp/file.csv
99.0
88.0
71.0
71.0