Arrays 在awk中,当数组遇到新字符串时,如何增加数组索引?

Arrays 在awk中,当数组遇到新字符串时,如何增加数组索引?,arrays,loops,awk,Arrays,Loops,Awk,我正在尝试解析ls输出(我知道这是不受欢迎的,但我需要为一个分配进行解析。)我需要计算每个用户的目录数,并在他们的用户名下打印出来 我有一个for循环来打印用户名/目录数: for (users in uid){ x++ totalUsers++; printf("User: %s\n", users); if(dirs[x]>0) printf(" dirs: %s\n", dirs[x]); }

我正在尝试解析ls输出(我知道这是不受欢迎的,但我需要为一个分配进行解析。)我需要计算每个用户的目录数,并在他们的用户名下打印出来

我有一个for循环来打印用户名/目录数:

for (users in uid){ 
       x++
       totalUsers++;
       printf("User: %s\n", users);


       if(dirs[x]>0)
        printf("   dirs: %s\n", dirs[x]);

    } 
我试过这个:

if(dirs[x] < $2) {
    dirs[x]=$2  
    x++
}
由此:

-rw-------  1 mce237 students     199 2020-03-01 18:41:59 .build1276786824731864129.log

-rw-------  1 mce237 students     199 2020-03-01 20:18:42 .build291177188595028335.log

-rw-------  1 mce237 students     199 2020-03-01 20:10:44 .build4195866878600813549.log

-rw-------  1 mce237 students     199 2020-03-01 20:08:55 .build4503681510908034369.log

-rw-------  1 mce237 students     199 2020-03-01 18:18:44 .build4964061885086964943.log

-rw-------  1 mce237 students     199 2020-03-01 20:17:13 .build5474334865226720725.log

-rw-------  1 mce237 students     199 2020-03-01 19:08:39 .build6322670020019345604.log

-rw-------  1 mce237 students     420 2020-03-01 20:08:08 .build8057453026527719771.log

您可以为
用户上的所有内容编制索引(
$3
),然后为需要跟踪的每个数量保留单独的数组。您可以检查第一个字段中的第一个字符是否为
'd'
,以确定文件是否为目录,还可以检查文件名中的第一个字符是否为
'。
以确定文件是否隐藏(是否要为用户计算每个目录的总数取决于您自己——如果不是,则添加
否则

要跟踪每个数量,然后在
END
规则中输出,可以执行以下类似操作:

ls -youroptions | awk '{
    user[$3]++
    storage[$3]+=$5
    if ($1 ~ /^d/)
        dir[$3]++
    if ($8 ~ /^[.]/)
        hidden[$3]++
}
END {
    for (i in user) 
        printf "user: %s\nfiles:\n(all/hidden): (%d/%d)\ndirs: %d\nstorage: %ld\n",
        i,user[i],hidden[i],dirs[i],storage[i]
}'
注意:在解析
ls
时,您可能需要添加
NR>1{…}
以避免将
的“total”
行打印为第1行,并且不同的选项和区域设置可能会产生与您显示的不同的字段顺序)

示例输出

使用提供的列表作为输入(假设
ls
output的每一行之间没有空行),将生成以下输出:

user: mce237
files:
(all/hidden): (8/8)
dirs: 0
storage: 1813

这将向您展示一种处理单独数组中不同计数的方法,所有这些计数都通过使用公共字段作为索引进行同步

为什么不
用户[$3]+
?还有
if($8~/^[.]/){hidden[$3]+
等等?非常感谢!这正是我完成这项工作所需要的突破。:)很高兴它有所帮助。
awk
是瑞士军刀,适用于所有东西的文本,一旦你与它处理一条记录(行)的事实成为朋友一次,您可以编写任意多的规则来处理每一行-这实际上只是每个规则中的普通编程
:)
祝您的脚本编写顺利!
user: mce237
files:
(all/hidden): (8/8)
dirs: 0
storage: 1813