我正在寻找一种方法来做类似的事情:
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
,最后跟任意字符。
拆分字符上的每一行,并用字段、、、/
组成一行,字段之间有一个,后跟一个字符串。5
6
7
8
/
",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]*