【问题标题】:AIX grep for an awk result用于 awk 结果的 AIX grep
【发布时间】:2016-10-10 17:13:29
【问题描述】:

我有一个名为“hosts.tbl”的文本文件:

BILL RED
VAL YELLOW
STEVE YELLOW
TOM ORANGE
BILLY RED
VALERIE BLUE

我有第二个文件,名为“details.tbl”,上面的每个名称都有多次(在每一行的各种其他详细信息中)。我需要计算每个名称在“details.tbl”中出现的次数,最终得到如下结果:

BILL RED 8
VAL YELLOW 16
STEVE YELLOW 9
TOM ORANGE 1
BILLY RED 2
VALERIE BLUE 30

如您所见,“BILL”的普通“grep”将同时给出“BILL”和“BILLY”。 “VAL”和“VALERIE”也一样。但是,在“details.tbl”文件中,每个名称的每次出现都后跟“-C”。例如:

STEVE-C
STEVE-C
BILL-C
BILLY-C

我试过了:

awk {'print $1 " " $2 " "'} hosts.tbl|grep -c $1"-C" details.tbl
awk {'print $1 " " $2 " "'grep -c $1"-C" details.tbl} hosts.tbl

...以及类似语法的各种其他排列,以上...所有令人沮丧的失败。很明显,我是一个新手,尤其是在 shell 命令方面,尤其是在 UNIX 方面。我在这里错过了什么?我在手册页中找不到有关如何在 grep 中连接搜索条件或如何仅将特定字段从 awk 传递给 grep 的任何内容。

假设 details.tbl 文件的适用部分如下所示:

BILL-C
VAL-C
STEVE-C
TOM-C
BILLY-C
VALERIE-C
BILL-C
VAL-C
STEVE-C
TOM-C
BILLY-C
VALERIE-C

输出应如下所示:

BILL RED 2
VAL YELLOW 2
STEVE YELLOW 2
TOM ORANGE 2
BILLY RED 2
VALERIE BLUE 2

【问题讨论】:

  • 不清楚您是否认为 return BILL 和 BILLY(例如)是您所需要的。鉴于您的 -C 文件,请编辑您的 Q 以显示 2 个条目之一的预期输出。 (虽然在这种情况下没有必要,但最好继续标记您的 AIX Q,因为该系统与 Linux 非常不同,甚至与其他供应商的旧式 Unixens 不同)。祝你好运。
  • 解释不同(如果我理解得很好):我有一个文件hosts.tbl,上面有名字和姓氏。另一个文件details.tbl 只有名字,后面跟着-Chosts.tbl 中的所有名字都是唯一的。我想计算所有的名字并告诉他们他们的姓氏。

标签: shell awk grep aix


【解决方案1】:

当您忽略 https://unix.stackexchange.com/a/169765/57293 时,您可以做出类似的解决方案

while read -r name lastname ; do
   printf "%s %s %s\n" ${name} ${lastname} $(grep -c "${name}-C" details.tbl)
done < hosts.tbl

使用 awk 时,应先处理 details.tbl 并计算行数。 What is "NR==FNR" in awk? 解释了在一个 awk 脚本中以不同方式处理 2 个文件。
你想忽略-C,你可以像这样用cut预处理输入文件:

awk 'NR==FNR {a[$0]++;next} {
       for(i in a) {
         if ($1==i) {
           print $0, a[i]
         }
       }
     }' <(cut -d"-" -f1<details.tbl) hosts.tbl

awk很聪明,不需要cut的预处理:

awk -F '[ -]' 'NR==FNR {a[$1]++; next} {
       for(i in a) {
         if ($1==i) {
           print $0, a[i]
         }
       }
     }' details.tbl hosts.tbl

【讨论】:

    【解决方案2】:

    cat hosts.tbl

    BILL RED
    VAL YELLOW
    STEVE YELLOW
    TOM ORANGE
    BILLY RED
    VALERIE BLUE
    

    猫详情.tbl

    BILL RED
    VAL YELLOW
    STEVE YELLOW
    TOM ORANGE
    BILLY RED
    VALERIE BLUE
    BILL RED
    VAL YELLOW
    STEVE YELLOW
    TOM ORANGE
    BILLY RED
    VALERIE BLUE
    BILL RED
    VAL YELLOW
    STEVE YELLOW
    TOM ORANGE
    

    使用 awk 命令,我们从第一个文件中获取名称并存储在数组 a 中,如果名称存在,我们从第二个文件中匹配,如果存在,则计数增加

    awk 'FILENAME == ARGV[1]{a[$0]=0;next} FILENAME == ARGV[2] && $0 in a{a[$0]+=1} END
    {for(i in a){print i,a[i]}} ' hosts.tbl  details.tbl
    

    输出

    VALERIE BLUE 2
    BILLY RED 2
    BILL RED 3
    VAL YELLOW 3
    TOM ORANGE 3
    STEVE YELLOW 3
    

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2013-12-12
      相关资源
      最近更新 更多