回到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
答案 0 :(得分:0)
如果您希望从所有文件中获取最小值,则必须立即对其所有内容进行排序。该命令当前按文件排序,因此您将获得第一个排序文件中的最小值。
检查
之间的区别find "$d" -type f -name 'mod*' -exec sort -k4 -g {} +
和
find "$d" -type f -name 'mod*' -exec sort -k4 -g {} \;
除非您确实需要,否则建议您使用-n
代替-g
。
查看--general-numeric-sort
的{{1}}部分,详细了解原因。
修改:刚刚查看了上一个问题的链接,我现在看到您需要使用info coreutils 'sort invocation'
那就是说,这是一种将相应的文件名放入行中的方法,这样你就可以在输出中找到它:
--general-numeric-sort
基本上为每个文件分别调用find "$d" -type f -name 'mod*' -exec awk '{print $0, FILENAME}' {} \;|sort -k4 -g |head -1 >> "$resultfile"
。 awk打印文件的每一行,并为其附加相应的文件名。然后传递所有这些行进行排序。
注意:以上将打印文件名及其awk
找到它的路径。如果您只想获取文件的基本名称,可以使用以下find
命令(其余的保持与上面相同):
awk