2016-06-09 43 views
1

我有一个文本文件,命名为“hosts.tbl”:AIX grep的用于AWK结果

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 

正如你所看到的,一个正常的“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时,我是新手。我在想什么,在这里?在man页面中找不到关于如何在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 
+1

它不清楚,如果你认为返回BILL和BILLY(例如)就是你需要的。给定你的'-C'文件,请**编辑你的Q **,以显示2个输入项目之一的预期输出。 (虽然在这种情况下不是必需的,但继续标记AIX Qs是个好主意,因为该系统与Linux非常不同,甚至是其他供应商的旧式Unixens)。祝你好运。 – shellter

+0

解释不同(如果我理解的很好):我有一个带有名字和姓氏的文件'hosts.tbl'。另一个文件'details.tbl'只有名字,后面跟着'-C'。 'hosts.tbl'中的所有名字都是唯一的。我想统计所有的名字,并把他们的姓氏给他们。 –

回答

1

猫hosts.tbl

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

cat details.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命令,我们从第一个文件,存放在数组名,从第2个文件中,我们匹配,如果名称存在,如果是,则计数递增

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 
1

当你忽略https://unix.stackexchange.com/a/169765/57293可以MAK e像

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并计算行数。 在一个awk脚本中处理2个文件的方式不同,详见What is "NR==FNR" in awk?
你想忽略-C,你可以预处理与cut像这样inputfile中:

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是聪明的,不需要用切预处理:

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