我有像
这样的目录./2012/NY/F/
./2012/NJ/M/
....
在这些目录下,有一些名称为Zoe
等的文件......
每个文件都包含一个数字。
我想在不同目录中将文件中的数字与相同文件名相加并找到最大值,我该怎么写?
答案 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"