[英]AWK, Create array of data in BEGIN {} block
我有一个电子表格,其中每列代表一周中的某一天。 列中的每个单元格都保存当天喂食的农场中动物的字符串值。 像这样:
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代码可能在很多层面都不正确。 但是,尽管我已经阅读了O'Reilly的“sed&awk”书并且整天引用了Google和谷歌,但我一直在全力反对这个问题。
任何帮助将不胜感激。
我现在要做的是构建一个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.