我有一個像在文件中添加和排序號
./2012/NY/F/
./2012/NJ/M/
....
在這些目錄中的目錄,有文件與像Zoe
等名字......
每個文件都包含一個數字。
我想總結文件中的數字在不同的目錄中具有相同的文件名,並找到總和的最大值,我該如何寫?
我有一個像在文件中添加和排序號
./2012/NY/F/
./2012/NJ/M/
....
在這些目錄中的目錄,有文件與像Zoe
等名字......
每個文件都包含一個數字。
我想總結文件中的數字在不同的目錄中具有相同的文件名,並找到總和的最大值,我該如何寫?
假設您./2012/NY/F
,/2012/sfs/XXS
下的所有目錄,也就是說,/home/yourusername/data/
,
如果你正在使用Unix或者你可以試試這個,如果你的cygwin您的Windows安裝
cd /home/yourusername/data ; find ./ -name yourfile_name_to_lookup.txt | xargs awk 'BEGIN {sum=0} ; {sum+=$1} ; END {print sum} '
我承擔從該文件的第一列開始的編號($1
)。
要找到文件,請使用諸如this question中指定的glob。
要進行實際的總結,也有相當根據的數字文件的數量和範圍的幾個可能性,但一個合理的通用方法是使用awk:
awk '{sum += $1} END { print sum }' file1 file2 ...
如果你知道文件和文件名的唯一名稱中沒有空格,則可以使用下面的命令。
cd 2012/
for i in "Zoe" "file2" "file3"
do
k=$(cat $(find . -type f -name "$i"));
echo $k | awk '{for(i=t=0;i<NF;) t+=$++i; $0=t}1';
done | sort -r
這將總結與子目錄同名的文件2012
和sort -r
下,將在最大返回號碼最小訂單。
我假定文件的全部內容是一個數字。我假設這個數字是一個整數。對於關聯數組需要bash 4
declare -A sum_for_file
for path in ./2012/*/*/*; do
((sum_for_file["$(basename "$path")"] += $(< "$path")))
done
max=0
for file in "${!sum_for_file[@]}"; do
if ((${sum_for_file["$file"]} > max)); then
max=${sum_for_file["$file"]}
maxfile=$file
fi
# you didn't say you needed to print it, but if you do
printf "%d\t%s\n" ${sum_for_file["$file"]} "$file"
done
echo "the maximum sum is $max found in files named $maxfile"
如何在這裏寫parent_dir?你能不能使用通配符給我一個方法(爲了鍛鍊目的)?謝謝! – Zoe
更新了我的答案。 –