2016-06-09 76 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