linux排序,选择最后一行,管道到新文件

时间:2014-01-15 19:38:52

标签: linux sorting csv grep

我有一系列多个文件。我想对这些文件进行排序,从每个文件中选择底线,并将这些行传输到一个新的单个文件中。

我的文件如下:

1,  100,  2.5
2,  100,  3.3
3,  100,  5.1
4,  100,  1.2

这些文件都名为51_Sur_extracted_data.csv

文件存放在父目录中,如下所示:

Track_0001 / output_dfsu / 51_Sur_extracted_data.csv Track_0002 / output_dfsu / 51_Sur_extracted_data.csv

所以我想对第3列中的所有csv文件进行排序,提取底线,并将其放入新的摘要文件中。基本上,目标是生成一个文件,该文件在所有父目录中具有第三列的最大值。理想情况下,我还想在输出文件中添加一个包含父目录名称(Track_0002)的列。

我有点想通了,但其余的对我来说有点麻烦。例如,我可以同时对所有csv文件进行排序并将输出写入新文件(例如51_Sur_extracted_data_sort.csv)吗?然后我可以grep最后一行并将其传递给一个新文件?

sort -t"," -k3,3g filename

谢谢, ķ

2 个答案:

答案 0 :(得分:2)

我会做这样的事情:

for a in */*/*.csv
do 
    dname="$(basename "$(dirname "$a")")"
    echo -e "$dname\t$(sort -t"," -k3,3g "$a" | tail -n 1)"
done

在我的测试文件中,它返回了:

output_abcd 3,  100,  9.1
output_bcde 3,  100,  5.1
output_cdef 3,  100,  5.1
output_abcd 3,  100,  5.1
output_bcde 3,  100,  5.1
output_cdef 3,  100,  5.1
output_abcd 3,  100,  5.1
output_bcde 3,  100,  5.1
output_cdef 1,  100,  7.5
output_abcd 3,  100,  5.1
output_bcde 3,  100,  5.1
output_cdef 3,  100,  5.1
output_abcd 3,  100,  5.1
output_bcde 3,  100,  5.1
output_cdef 3,  100,  5.1
output_abcd 3,  100,  5.1
output_bcde 3,  100,  5.1
output_cdef 3,  100,  5.1
output_abcd 3,  100,  5.1
output_bcde 2,  100,  42.3
output_cdef 3,  100,  5.1
output_abcd 3,  100,  5.1
output_bcde 3,  100,  5.1
output_cdef 3,  100,  5.2
output_abcd 3,  100,  5.1
output_bcde 3,  100,  5.1
output_cdef 3,  100,  5.1

是的,我的输入数据有点无聊。当然你可以再次对结果进行排序,但我会把它留给你的想象(你已经有了这一步):)

答案 1 :(得分:1)

如果您想要任何给定命令的最后一行,请使用tail

所以对你来说,你会这样做:

sort -t"," -k3,3g filename | tail -n1 > newfilename