在文件中添加和排序数字

时间:2013-09-23 19:20:08

标签: regex shell unix command

我有像

这样的目录
./2012/NY/F/ 
./2012/NJ/M/ 
....

在这些目录下,有一些名称为Zoe等的文件......

每个文件都包含一个数字。

我想在不同目录中将文件中的数字与相同文件名相加并找到最大值,我该怎么写?

4 个答案:

答案 0 :(得分:1)

假设您的./2012/NY/F/2012/sfs/XXS位于目录下,例如/home/yourusername/data/

如果您使用的是* nix,或者如果您在Windows上安装了cygwin,则可以尝试此操作

    cd /home/yourusername/data ; find ./ -name yourfile_name_to_lookup.txt | xargs awk 'BEGIN {sum=0} ; {sum+=$1} ; END {print sum} '

我假设该数字从该文件的第一列开始($1)。

答案 1 :(得分:1)

要查找文件,请使用this question中指定的glob。

要进行实际的求和,根据文件的数量和数字的范围,有很多可能性,但是合理的通用方式是使用awk:

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

答案 2 :(得分: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

这将在2012下的子目录中汇总具有相同名称的文件,而sort -r将返回最大到最小订单的数字。

答案 3 :(得分: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"