bash:awk目录下可能有空格的所有文件,将它们视为同一个文件

时间:2014-12-12 16:44:17

标签: arrays bash awk find

尝试在目录和所有子目录下查找具有特定命名结构的所有文件,并使用awk解析出我想要的数据。只要文件夹或文件的名称中没有空格,我就能得到它。

我首先使用find来查找文件并将它们放在一个数组中。然后我使用数组作为awk的文件名。但是数组会将任何空格视为不同的元素,因此它会将/Documents/Untitled Folder/file.txt拆分为/Documents/UntitledFolder/file.txt

任何方式推送可能还包含空格的文件?到目前为止,这是有效的,如果没有没有空格的文件/目录/子目录。

arrFindFiles=($(find . -name "f*.txt" | sed 's/\ /\\\ /g'))    
arrData+=("$(awk -F , '{if($9$10!=NULL) a[$9$10$13]++ } END { for (b in a) { print b } }' ${arrFindFiles[@]})")    

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

让我猜一下。

生成一个临时文件,列出当前文件夹中的所有txt文件。

$ find . -type f -name "f*.txt" > temp.txt

$ cat temp.txt
./b/f ab.txt
./b/fa.txt
./f a b.txt
./fab.txt

然后运行awk命令找出重复的名称。

awk -F \/ '{a=$0;b=$NF;gsub(/ /,"",$NF);c[$NF]=c[$NF]==""?a:c[$NF] OFS a;d[$NF]++}
    END{for (i in d) if (d[i]>1) print "found duplicate name: \n" c[i]}' OFS=" | " temp.txt

found duplicate name:
./b/f ab.txt | ./f a b.txt | ./fab.txt

答案 1 :(得分:0)

对于使用带空格的文件的第一行,只需将eval放在前面:

eval arrFindFiles=($(find . -name "f*.txt" | sed 's/\ /\\\ /g'))

要使第二行工作,请将双引号仅放在${arrFindFiles[@]}

附近
arrData+=($(awk -F, '{ if ($9$10!=NULL) a[$9$10$13]++ } END { for (b in a) { print b } }' "${arrFindFiles[@]}"))