在 awk 命令的 END 块中使用 FOR 循环

在 awk 命令的 END 块中使用 FOR 循环

我正在尝试查找每天的平均文件数。

以下脚本有效:

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
               printf "%s\t%d\n", date, freq[date]
}'

当我为 for 循环添加 do 和 done 时,如下所示:

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
do
               printf "%s\t%d\n", date, freq[date]
done
}'

我收到以下错误:

awk: cmd. line:8: done
awk: cmd. line:8: ^ syntax error

如何在awk命令的END块内编写多行for循环语句?

解决方案:

我们需要使用 { 和 } 在 awk 命令的 END 块中开始和结束 for 循环。

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
{
        count=count+1
        total=total+freq[date];
        printf "%s\t%d\n", date, freq[date]
}
printf "Average files per day : %d\n",(total/count)
}'

答案1

根本没有donein语法,就像 一样。awkdodo statement while (condition)

您需要使用大括号:

for (date in freq) { cmd1; cmd2; cmd3; }

答案2

请考虑,一般来说,解析ls输出是有问题的。

为什么你不应该解析 ls 的输出(加上链接页面)。

作为操作文件日期/时间的解决方案,您可以使用 GNU find(如果可用)并使用 GNU 扩展,例如-printf "%T@"获取UNIX 纪元时间或以易于解析的格式输出时间。 (检查man find在这里阅读 )。

--编辑:凯文指出这一点:

BSD find(和其他实现)没有此功能。但可以使用stat(如果存在)来获取相同的信息。检查一下人。

--编辑结束

例如,你可以这样做:

find . -maxdepth 1 -type f -printf "%TY%Tm%Td-%TH%TM%TS" 

获取YYYYMMDD-HHMMSS格式的修改时间。

相关内容