我的文本文件示例中的每一行(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,但任何其他解决方案都可以。
答案 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