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

时间:2017-03-10 02:20:28

标签: python bash

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

我有名为RUN1RUN2RUN3的目录 每个目录都有一些文件。目录RUN1包含文件mod1_1.csvmod1_2.csvmod1_3.csv。目录RUN2包含文件mod2_1.csvmod2_2.csvmod3_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

1 个答案:

答案 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