2014-01-15 32 views
3

我有一系列的多个文件。我想对这些文件进行排序,从每个文件中选择最后一行,然后将这些行输入到一个新的单个文件中。linux排序,选择最后一行,管道到新文件

我的文件是这样的:

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

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

我有这样的想法,但其余的证明对我来说有点麻烦。例如,我可以同时对所有csv文件进行排序并将输出写入新文件(例如51_Sur_extracted_data_sort.csv)?然后,我可以grep最后一行,并管它到一个新的文件?

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

感谢, ķ

回答

1

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

那么对你来说,你可以这样做:

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

我可以跨多个文件吗?我想我可以建立一个循环。 – kimmyjo221

+0

详细说明“跨多个文件执行此操作”。你可以指定多个输入到'sort',但它将全部是一个输出流,它被发送到'tail',然后被重定向到'newfilename'。 –

+0

@AndyLester这个问题有很多关于这方面的细节 – sehe

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 

呀,我的输入数据有点无聊。当然,你可以再次排序最终结果,但我会留下你的想象力(你已经有了这一步):)

+0

查看** [住在Coliru](http://coliru.stacked-crooked.com/a/5c715776b9e7e8ca)**完成我的演示数据在27 dirs/files – sehe