查找并重定向以捕获模式文件名

查找并重定向以捕获模式文件名

我正在寻找一种方法来做类似的事情:

find /path -name "201[2-6]*" | awk -F"/" '{print $5"/"$6"/"$7"/"$8",0,0,0"}' > archives_201\1.csv

其中archives_201\1.csv可能是archives_201[2-6].csv捕获文件名的结果。

我知道我可以通过循环一年来做到这一点。因为该文件夹可能包含约 1 亿个文件,所以我应该避免它。

[编辑]

我也尝试过

 find /path -name "201[2-6]" | awk -F"/" 'BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}' 

但得到了

awk: BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}
awk:                                                                  ^ syntax error

答案1

问题一:

进程驻留在 中的文件/path,其名称以 开头201,后跟2和之间的单个数字6,最后跟任意字符。

拆分字符上的每一行,并用字段、、、/组成一行,字段之间有一个,后跟一个字符串。5678/",0,0,0"

将该行以及任何后续行存储在一个名为 file 的文件中,该文件的名称后跟archives_201先前在输入文件名中找到的相同的单个数字,扩展名为.csv.

解决方案一:

awk -F/ '
    FNR==1 {match(FILENAME, /\/(201[2-6])/, m)}
    {print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"}
' /path/201[2-6]*

评论:

由于您没有提供示例输入文件和所需的输出,因此我不得不对多个点进行一些猜测。

我不知道你想用什么来完成:> ${8:0:4}"_export_0504.csv"

find通过管道将结果输入awk让我感到困惑:您想awk实际读取每个文件还是只处理文本列表?如果是后者,字段的严格组成($5"/"$6"/"$7"/"$8)意味着您希望所有文件都位于同一目录中,那么为什么要使用find呢?

我假设除了文件名之外没有以搜索字符串 开头的路径部分201[2-6]。我假设您想要向>>同一个文件添加 ( ) 多行,而不是在需要时覆盖它 ( >)。我假设所有文件都在同一目录中,并且我假设awk要处理文件内容而是记录在案名字

不过,作为字段分隔符的选择/暗示了后一种假设,所以我也会尝试解决这个问题。


问题2:

处理驻留在 中的文件的文件名/path,其名称以 开头201,后跟2和之间的单个数字6,最后跟任意字符。

根据字符拆分每个文件名/,并用第 5、6、7 和 8 个组成部分(保留/它们之间的内容)组成一行,后跟一个",0,0,0"字符串。

将该行以及任何后续行存储在一个文件中,该文件的名称archives_201后跟文件名前面找到的相同单个数字,扩展名为.csv.

解决方案2:

awk -F/ '
    FNR==1 {
        match(FILENAME, /\/(201[2-6])/, m);
        $0=FILENAME;
        print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"
    }
' /path/201[2-6]*

相关内容