2016-06-23 2 views
0

У меня есть файл, подобный этому:Подсчет вхождений букв в таблице с AWK

location1 person1 - 
location2 person1 a 
location3 person1 c 
location2 person2 x 
location1 person2 - 
location3 person2 - 

Каждый файл имеет несколько записей для каждого человека в разных местах (обратите внимание на порядок расположения не то же самое для каждого человека). Третья колонка - это буква или «-».

Я AWK чтение файла, и я хочу, чтобы получить результирующую таблицу следующим образом:

person location1 location2 location3 
person1 0 1 1 
person2 0 1 0 

Где было письмо для человека и место, оно записывается как 1 в таблице, и если исходная таблица имела «-», то она записывается как 0 в таблице результатов.

Моя скромная попытка (не работает хорошо, но, по крайней мере, я думаю, что ассоциативный массив должен быть в коде где-то):

awk -F" " '{if($3!="-") a[$2]=$1} END {for (k in a) print k} file.txt 
+0

Вы всегда будете иметь 'location' 1-3 (или) 1-N? – sat

+0

1-N, и может быть полезно учитывать случаи, когда люди не отображаются во всех местах. Например person3 может иметь только две строки, для location1 и location2 .. – HollowBastion

ответ

1

Хранить данные в подражатель-матрице, а затем через петлю также сохраненные места и лица!

{ 
seen[$1 FS $2]=(($3 == "-") ? "-" 0 : 1); 
locs[$1] 
people[$2] 
} 
END { 
     for (loc in locs) 
     printf "\t%s", loc 
     print "" 
     for (person in people) { 
      printf "%s%s", per, FS 
      for (loc in locs) 
       printf "%d\t", seen[loc FS person] 
      print "" 
     } 
} 

в действии:

$ awk -f a.wk your_file 
location1 location2 location3 
person1 0 1 1 
person2 0 1 0 
Смежные вопросы