繁体   English   中英

AWK,在BEGIN {}块中创建数据数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM