Сравнить файл со списком переменных AWK - PullRequest
0 голосов
/ 19 января 2010

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

Файл:

Dat1 Loc1

Dat2 Loc1

Dat3 Loc1

Dat4 Loc2

Dat5Loc2

Мой список выглядит примерно так:

Dat1

Dat2

Dat3

Dat4

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

Dat1 MATCHED Loc1Count = 1

Dat2 MATCHED Loc1Count = 2

Dat3 MATCHEDLoc1Count = 3

Dat4 MATCHED Loc2Count = 1

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

Сейчас,

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

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

1 Ответ

2 голосов
/ 19 января 2010
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
...