我有一个电子表格,其中每列代表一周中的一天。列中的每个单元格都保存着当天饲养的农场动物的字符串值。像这样:
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
cow, cow, cow, cow, cow, cow, cow,
goat, goat, goat, goat, goat, goat,
horse, horse, , horse, horse, horse, horse
, pig, , , pig, , ,
duck, duck, duck, duck, duck, goose, duck
, , , , , , goat
请注意,奶牛每天都被喂养,山羊每天都被喂食,但记录在两排不连贯的地方,马周三没有被喂食,猪只在周二和周五被喂食,周六他们没有喂鸭子,而是喂鹅,但将其记录在鸭线上。
我现在想做的是构建一个AWK脚本,告诉我一周中每天都给哪些动物喂食。
我想我想做的是对数据进行一次循环,并为字段$7中的每个唯一值创建一个关联数组,其想法是,如果一只动物在周日没有被喂食,它就不是一周中的每一天都被喂食。
然后,我想再次循环浏览该文件,并在找到动物的每一天增加数组的值。然后我想把每天喂食的每只动物的名字打印出来。
这是我迄今为止得到的伪代码:
awk -F "," 'FNR > 1 BEGIN {
[SOMEHOW MAGICALLY CONSTRUCT AN ARRAY HOLDING THE VALUES OF FIELD $7]
}
{
for (i=1; i <= NR; i++) {
if ($i in animals) {
animals[$i]++
}
else {
animals[$i]=0
}
}
}
END {
for (animal in animals) {
if (animals[animal]==7) {
print $animal[animal]
}
}
}
}
我知道AWK代码可能在很多层面上都不正确。但我一整天都在为这个问题绞尽脑汁,尽管我整天都在读奥的"sed&awk"书,并参考它和谷歌。
如有任何帮助,我们将不胜感激。
我现在想做的是构建一个AWK脚本,它会告诉我每周每天给哪些动物喂食。
每天只喂山羊和奶牛:
$ awk -F'[[:space:]]*,[[:space:]]*' 'NR>1{for (i=1;i<=7;i++) if ($i) fed[$i]+=1} END{for (a in fed) if (fed[a]==7) print a}' farmdata
goat
cow
它的工作原理
awk在文件中的每个记录(行)上隐式循环。这个脚本使用一个名为fed
的数组来跟踪每只动物被喂食的次数
-F'[[:space:]]*,[[:space:]]*'
这将字段分隔符设置为逗号以及相邻的空白(如果有的话)。
NR>1{for (i=1;i<=7;i++) if ($i) fed[$i]+=1}
对于第一行之后的每一行,在每个字段上循环,并在该字段中的名称计数上加一。
END{for (a in fed) if (fed[a]==7) print a}
当我们到达文件的末尾后,把每只被喂了七次的动物都打印出来。
多行
对于那些喜欢代码分布在多行的人:
awk -F'[[:space:]]*,[[:space:]]*' '
NR>1{
for (i=1;i<=7;i++)
if ($i) fed[$i]+=1
}
END{
for (a in fed)
if (fed[a]==7) print a
}
' farmdata