Bash:在目录中排序,将文件内容与新文件

时间:2017-03-23 17:24:13

标签: bash

我有一组目录RUN1,RUN2等

在每个目录中,都有一组文件。在每个文件中,有两个数字。例如(这些保存为.csv,即使这里显然没有逗号):

RUN1

mod_1.csv
2.32e-00
1.2e-01

mod_b.csv
4.53e-00
1.1e-01

RUN2

mod_a.csv
1.23e-01
0.5e-02

mod3.csv
1.67e-00
0.4e-01

我想这样做:

For each directory:
    For each file in a directory:
        Sort files by the first entry
        Save contents and path of file with smallest value of first entry.

例如,在上面,这将产生一个包含以下内容的新文件:

2.32e-00 1.2e-01 ./RUN1/mod_1.csv
1.23e-01 0.5e-02 ./RUN2/mod_a.csv

我开始尝试这个:

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

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

但它给了我所有文件的两个值,如:

2.32e-00 ./RUN1/mod_1.csv
1.2e-01  ./RUN1/mod_1.csv
4.53e-00 ./RUN1/mod_b.csv
1.1e-01  ./RUN1/mod_b.csv
1.23e-01 ./RUN2/mod_a.csv
0.5e-02  ./RUN2/mod_a.csv
1.67e-00 ./RUN2/mod_3.csv
0.4e-01  ./RUN2/mod_3.csv

然后我想我需要使用head,但是这个修改:

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

给了我:

find: `awk' terminated by signal 13

我想我需要另一个sort,可能head,但我不能把它放在一起。

编辑(为清晰起见):

我想查看目录中的所有文件,查找具有最小第一个数字的文件,并将该文件的值和文件路径写入新文件。然后,继续下一个目录并执行相同操作。在我的例子中:

目录RUN1包含文件mod_1.csvmod_b.csv。文件mod_1.csv具有最小的第一个值。我想在一行上写下它的内容和文件路径:

 2.32e-00 1.2e-01 ./RUN1/mod_1.csv 

到文件。

目录RUN2包含mod_a.csvmod3.csv个文件。文件mod_a.csv具有最小的第一个值。我想在一行上写下它的内容和文件路径:

1.23e-01 0.5e-02 ./RUN2/mod_a.csv

这样新文件看起来像这样:

 2.32e-00 1.2e-01 ./RUN1/mod_1.csv
 1.23e-01 0.5e-02 ./RUN2/mod_a.csv

我理解在我的编辑前问题中并不清楚这一点。请问你有任何问题!我不确定如何更清楚。

1 个答案:

答案 0 :(得分:0)

您可能希望在find期间删除新的内容:

resultfile="best_results.txt"

for d in $(find . -type d -name 'RUN*');
do
   find "$d" -type f -name 'mod*' -exec awk '{printf "%s ",$0} END {print "", FILENAME}' {} \;
done | sort >> "$resultfile"

排序通常在最后完成(一旦从stdout返回所有结果),但是,目前还不清楚您对它的预期排序方式。如果你真的想要的话,你可能可以摆脱for loop,因为使用如下的东西应该是类似的:

find RUN* -type f -name 'mod*' -exec awk '{printf "%s ",$0} END {print "", FILENAME}' {} \; | sort -k 2,2 >> "$resultfile"

使用-k选项与sort一起指定要排序的列。

结果(使用sort -k 2,2):

1.67e-00 0.4e-01  RUN2/mod3.csv
1.23e-01 0.5e-02  RUN2/mod_a.csv
4.53e-00 1.1e-01  RUN1/mod_b.csv
2.32e-00 1.2e-01  RUN1/mod_1.csv