Bash:查找和路径

时间:2017-03-13 19:51:08

标签: bash

作为this question的扩展,我现在不仅要知道文件名,还要知道最多k个位置的目录。这就是问题所在:

我有名为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_onelayer.txt"
for d in $(find . -type d -name 'RUN*' | sort);
do
 find "$d" -type f -name 'mod*' -exec awk '{print $0, FILENAME}' {} \;|sort -k4 -g |head -1 >> "$resultfile"
done

这给了我:

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

但我想要一个包含以下内容的.csv文件:

5.73 6.43 5.76 6.57 ./DIR1/DIR2/DIR3/RUN_1/mod1_2.csv
5.72 6.29 5.39 5.59 ./DIR1/DIR2/DIR3/RUN_2/mod2_1.csv

我的密码是/DIRk/DIRm/DIRl/DIR1/DIR2/DIR3

编辑:

根据回复,我的意思是“回位”'是:

现在,我的代码将./RUN_1/mod1_2.csv作为第一行中的最后一列值。对我来说,这是一个后退的位置,因为它显示了文件mod1_2.csv所在的目录。我希望路径能够回到原来的位置。也就是说,我想./DIR1/DIR2/DIR3/RUN_1/mod1_2.csv。我说' k'因为这是一个共同的占位符,我希望我可以在那里替换一个数字。

4 个答案:

答案 0 :(得分:1)

根据dgeorgiev的回答,我将收集代码的结果放在层次结构中更深层的目录中。所以,继续我的问题,如果我的pwd/DIRk/DIRm/DIRl/DIR1/DIR2/DIR3,我将.sh文件移至DIRk/DIRm/DIRl。然后我跑了这个:

#!/bin/bash
resultfile="best_results_mlp.txt"

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

done

结果是,按照需要:

5.73 6.43 5.76 6.57 ./DIR1/DIR2/DIR3/RUN_1/mod1_2.csv
5.72 6.29 5.39 5.59 ./DIR1/DIR2/DIR3/RUN_2/mod2_1.csv

答案 1 :(得分:0)

我在这些CSV中看不到任何逗号。我假设你只是用空格分开。由于您已经在find行中使用了awk,我想我们可以假设您对基于awk的选项持开放态度。

$ find . -type f
./RUN1/mod1_1
./RUN1/mod1_2
./RUN2/mod2_1
./RUN2/mod2_2
$ awk 'NR == 1 {n=$4} $4 > n {n=$4; f=FILENAME} END {print f,n}' RUN*/mod*
RUN2/mod2_1 7.34

这使用awk内置变量FILENAME,它始终包含当前文件的名称。

我无法从你的问题中看出“k position back”是什么意思,但你可以根据自己的意愿去除或解析这个输出。

答案 2 :(得分:0)

继我在上一个问题中的答案之后:

find使用找到它的路径传递文件。因此,如果您在"/path/to/$d"中搜索,则会获得"/path/to/$d/filename.csv"。只需在您想要的路径中进行find搜索即可。

因此,如果您的RUN*目录位于/path/to/,并且您希望结果中包含./to/RUNx/filename.csv,那么您可以随时

cd /path/ && find ./to/RUNx/ # ...

如果您需要绝对路径,则可以在find

上运行/path/to/RUNx

更改目录时要小心,并确保在必要时更改回您所需的位置。 (例如,您可能必须提供输出文件的路径)

答案 3 :(得分:-1)

这样的事情

// Menu
jQuery(function($) {
    $('.header-menu-toggle').on('click', function(e){
        e.preventDefault();
        $('.tab-nav-menu >ul >li').animate({
            opacity: 0
        }, 200).animate({
            bottom: '-25px'
        }, 50);

        if($('.tab-nav-menu').hasClass('tab-invisible') ){
            $('.tab-nav-menu').css({'right':'-1em'});
            $('.tab-nav-menu').removeClass('tab-invisible').addClass('tab-visible');
            $(this).find('.burg').addClass('activeBurg');
        }
        else{
            $('.tab-nav-menu').css({'right':'-100%'});
            $('.tab-nav-menu').removeClass('tab-visible').addClass('tab-invisible');
            $(this).find('.burg').removeClass('activeBurg');
        }
        var delay = 600;
        var duration = 400;
        if( $(".header-navigation-menu").hasClass("strip-header-menu") ){
            delay = 250;
        }
        $('.tab-nav-menu >ul >li').each(function(){
            $(this).delay(delay).animate({
                opacity: 1,
                bottom: 0,
            }, duration);
            delay += 150;
        });
    })
});

(抱歉我最初误解了您的要求,编辑以纠正问题)