2010-01-18 73 views
0

我在試圖讓一個看似簡單的事情完成的過程中陷入困境。我有一個文件和一個換行符分隔的字符串列表。將文件與變量列表進行比較AWK

文件:

DAT1 LOC1

DAT2 LOC1

DAT3 LOC1

DAT4中Loc2

DAT5中Loc2

我的列表是這樣的:

DAT1

DAT2

DAT3

DAT4

我所試圖做的是列表中的數據文件進行比較並計算出現的唯一Loc的數量。我只對最大的數字感興趣。在上面的例子中,列表進行比較,以該文件的情況下,我想主要爲:

DAT1 MATCHED Loc1Count = 1

DAT2 MATCHED Loc1Count = 2

DAT3 MATCHED Loc1Count = 3

Dat4 MATCHED Loc2Count = 1

Return:Loc1 if Loc1Count /名單> 50%

現在的長度,

我知道AWK 1文件將逐行讀取一個文件行。此外,我知道「echo」$ LIST「| awk'/搜索包含這個/的行」將返回與該內部字符串匹配的行。我還沒有能夠成功地將這些想法作爲嵌套的awk結合起來,更不用說如何計算「loc1」與「loc2」(順便說一句,這將是隨機字符串,而不是形式標準)

我覺得這很簡單,但我把頭撞在牆上。有任何想法嗎?這是否足夠清楚?

+0

你正在尋找被稱爲關聯數組(如** ghostdog74的**回答所示)的功能。 – 2010-01-18 23:50:50

回答

2
list="Dat1 Dat2 Dat3 Dat4" 
awk -vli="$list" 'BEGIN{ 
    # here list from shell is converted to awk array "list". 
    m=split(li,list," ") 
} 
{ 
    # go through the list 
    for(i=1;i<=m;i++){ 
     if($1 == list[i]){ 
      # if Dat? is found in list, print , at the same time 
      print $1" matched Locount="$2" "++data[$2] # increment the count for $2 and store in loc array 
      loc[$2]++ 
     } 
    } 
} 
END{ 
    # here returns loc1 count 
    loc1count=loc["Loc1"] 
    if((loc1count/m *100) > 50) { 
     print "Loc1 count: "loc1count 
    } 
} ' file 

輸出

$ ./shell.sh 
Dat1 matched Locount=Loc1 1 
Dat2 matched Locount=Loc1 2 
Dat3 matched Locount=Loc1 3 
Dat4 matched Locount=Loc2 1 
Loc1 count: 3 
+0

哎呀 - 我很難找到如何將我的變量 「$ LIST」 AWK:非法場$(),名稱爲 「LIST」 源1號線 返回時:msplit($ LIST,列表「\ n」) – 2010-01-19 00:05:13

+0

awk變量和shell變量是不同的。要將shell變量傳遞給awk,請使用-v選項。 – ghostdog74 2010-01-19 00:11:59

+0

我用awk -v LIST = $ {LIST}'BEGIN ... – 2010-01-19 00:14:36