Awk подсчета случаев странное поведение - PullRequest
1 голос
/ 15 октября 2011

Мне нужно посчитать количество вхождений элементов второго столбца в большое количество файлов.Сценарий, который я использую, таков:

{
 el[$2]++
}
END {
    for (i in el) {
    print i, el[i] >> "rank.txt"
    }
 }

Для запуска с большим количеством файлов я использую find | xargs следующим образом:

find . -name "*.txt" | xargs awk -f script.awk

Проблема в том, чтоесли я посчитаю количество строк в выходных файлах rank.txtwc -l rank.txt), то число, которое я получу (например, 7600), будет больше, чем количество уникальных элементов второй строки (например, 7300), что яполучить с помощью:

find . -name "*.txt" | xargs awk '{print $2}' | sort | uniq | wc -l

Фактически давая:

awk '{print $1}' rank.txt | sort | uniq | wc -l

Я получаю правильное количество элементов (следуя примеру, я получу 7300).Таким образом, это означает, что элементы первого столбца выходных файлов не являются уникальными.Но этого не должно случиться!

Ответы [ 2 ]

5 голосов
/ 15 октября 2011

Вероятно, это сочетание того факта, что входные файлы (*.txt) содержат неуникальные элементы и функциональность xargs. Помните, что xargs, когда существует большое количество файлов, вызывается неоднократно с различным набором аргументов. Это означает, что в первом примере, если имеется большее количество файлов, некоторые файлы не обрабатываются за один прогон awk, что приводит к увеличению количества «уникальных» элементов в выходных данных.

Вы можете попробовать это:

find . -name "*.txt" | xargs cat | awk -f script.awk
0 голосов
/ 15 октября 2011

Вы можете узнать, где находятся недубликаты в $ 1, используя

find . -name "*.txt" | xargs awk '{print $2}' | sort | uniq -c | awk '$1 > 1 {print}'

У меня нет способа проверить это прямо сейчас, цель последнего awk - отфильтровать вывод uniq -c, чтобы показывать только записи, количество которых больше единицы.

Надеюсь, это поможет.

...