2010-01-18 5 views
0

Я наткнулся на себя, пытаясь добиться, казалось бы, простой вещи. У меня есть один файл и один список строк с разделителями строк.Сравнить файл с переменным списком AWK

Файл:

DAT1 LOC1

dat2 LOC1

Dat3 LOC1

Dat4 LOC2

Dat5 LOC2

Мой список что-то вроде этого:

DAT1

dat2

Dat3

Dat4

То, что я пытаюсь сделать, это сравнить список с файлом данных и подсчитайте количество уникальных Locs, которые появляются. Меня интересует только самый большой подсчет. В приведенном выше примере, при сравнении списка в файл, я хочу по существу:

DAT1 MATCHED Loc1Count = 1

dat2 MATCHED Loc1Count = 2

Dat3 MATCHED Loc1Count = 3

Dat4 MATCHED Loc2Count = 1

Возврат: LOC1 если Loc1Count/Длина списка> 50%

Теперь

Я знаю, что AWK 1 файл будет читать файл строка за строкой. Кроме того, я знаю, что «echo» $ LIST «| awk»/поиск строки, содержащей этот/», вернет строку, соответствующую этой внутренней строке. Я не смог успешно объединить эти идеи, хотя вложенные awks, а тем более как считать «loc1» vs «loc2» (которые, кстати, будут случайными строками, а не стандартными)

Я чувствую, что это просто, но я ударяю головой о стену. Есть идеи? Является ли это достаточно ясным?

+0

Функция вы ищете (как показано на ** ghostdog74 х ** ответ) называется ассоциативные массивы. –

ответ

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") –

+0

переменные awk и переменные оболочки различны. для передачи переменных оболочки в awk используйте опцию -v. – ghostdog74

+0

У меня нет успеха с awk -v LIST = $ {LIST} 'BEGIN ... –