2013-09-23 54 views
0

我有一個像在文件中添加和排序號

./2012/NY/F/ 
./2012/NJ/M/ 
.... 

在這些目錄中的目錄,有文件與像Zoe等名字......

每個文件都包含一個數字。

我想總結文件中的數字在不同的目錄中具有相同的文件名,並找到總和的最大值,我該如何寫?

回答

1

假設您./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)。

+0

如何在這裏寫parent_dir?你能不能使用通配符給我一個方法(爲了鍛鍊目的)?謝謝! – Zoe

+0

更新了我的答案。 –

1

要找到文件,請使用諸如this question中指定的glob。

要進行實際的總結,也有相當根據的數字文件的數量和範圍的幾個可能性,但一個合理的通用方法是使用awk:

awk '{sum += $1} END { print sum }' file1 file2 ... 
1

如果你知道文件和文件名的唯一名稱中沒有空格,則可以使用下面的命令。

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 

這將總結與子目錄同名的文件2012sort -r下,將在最大返回號碼最小訂單。

1

我假定文件的全部內容是一個數字。我假設這個數字是一個整數。對於關聯數組需要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"