微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-Bash:从最大列递归地向文件写入一行

回到my previous question,我发现问题并没有完全解决.这是问题所在:

我有名为RUN1,RUN2和RUN3的目录
每个目录都有一些文件.目录RUN1具有文件mod1_1.csv,mod1_2.csv,mod1_3.csv.目录RUN2具有文件mod2_1.csv,mod2_2.csv,mod3_3.csv等.

mod1_1.csv文件内容如下所示:

5.71 6.66 5.52 6.90
5.78 6.69 5.55 6.98
5.77 6.63 5.73 6.91

而mod1_2.csv看起来像这样:

5.73 6.43 5.76 6.57
5.79 6.20 5.10 7.01
5.71 6.21 5.34 6.81

在RUN2中,mod2_1.csv如下所示:

5.72 6.29 5.39 5.59
5.71 6.10 5.10 7.34
5.70 6.23 5.23 6.45

并且mod2_2.csv看起来像这样:

5.72 6.29 5.39 5.69
5.71 6.10 5.10 7.32
5.70 6.23 5.23 6.21

我的目标是为每个RUN *目录获取第4列的最小值的行,并将其和将其写入新的.csv文件的模型写入.现在,我有以下代码

#!/bin/bash
resultfile="best_results_mlp_2.txt"
for d in $(find . -type d -name 'RUN*' | sort);
do
  find $d -type f -name 'mod*' -exec sort -k4 {} -g \; | head -1 >> "$resultfile"
done

但是它并不总是返回第4列的最小值(我浏览了文件并进行了检查),并且不包括包含最小数字的文件名.为了澄清,我想要一个包含以下内容的.csv文件

5.73 6.43 5.76 6.57 mod1_2.csv
5.72 6.29 5.39 5.59 mod2_1.csv

解决方法:

如果要从所有文件获取最小值,则必须立即对所有内容进行排序.该命令当前按文件文件进行排序,因此您将在第一个排序的文件中获得最小值.

检查之间的区别

find "$d" -type f -name 'mod*' -exec sort -k4 -g {} + 

find "$d" -type f -name 'mod*' -exec sort -k4 -g {} \;

另外,除非确实需要,否则建议使用-n而不是-g.
查看信息coreutils的“一般调用”的–general-numeric-sort部分,以获取更多详细信息.

编辑:刚刚检查了您以前的问题的链接,现在我看到您需要使用–general-numeric-sort

就是说,这是一种将相应文件名放入各行中的方法,以便在输出中使用它:

find "$d" -type f -name 'mod*' -exec awk '{print $0, FILENAME}' {} \;|sort -k4 -g |head -1 >> "$resultfile"

本质上,awk是分别为每个文件调用的. Awk打印文件的每一行,并在其后附加相应的文件名.然后将所有这些行传递进行排序.

注意:上面的代码将打印文件名及其找到文件的路径.如果您只想获取文件的基本名称,则可以改用以下awk命令(其余与上面相同):

awk 'FNR==1{ cnt=split(FILENAME, arr, "/"); basename=arr[cnt] } { print $0, basename}'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐