Искать в файле имена пользователей и сортировать количество экземпляров для каждого пользователя в файле? - PullRequest
0 голосов
/ 17 мая 2018

Мне поручено взять файл, в котором есть строковые записи, содержащие строку username=xxxx:

$ cat file.txt
Yadayada username=jdoe blablabla
Yadayada username=jdoe blablabla
Yadayada username=jdoe blablabla
Yadayada username=dsmith blablabla
Yadayada username=dsmith blablabla
Yadayada username=sjones blablabla

, и найти, сколько раз появляется каждый пользователь в файле, что я могу сделать вручную, введяusername=jdoe например:

$ grep -r "username=jdoe" file.txt  | wc -l | tr -d ' '
3

Каков наилучший способ сообщить каждого пользователя в файле и количество строк для каждого пользователя, отсортированные по максимальным и минимальным значениям:

3    jdoe
2    dsmith
1    sjones

Я думал о том, как подойти к этому, но, рисуя пробелы, решил, что я бы посоветовался с нашими гуру на этом форуме.:)

TIA, Дон

Ответы [ 6 ]

0 голосов
/ 17 мая 2018

После awk может помочь вам тоже.

awk -F"[ =]" '{a[$3]++} END{for(i in a){print a[i],i | "sort -nr"}}'  Input_file
0 голосов
/ 17 мая 2018
$ awk -F'[= ]' '{print $3}' file | sort | uniq -c | sort -nr
      3 jdoe
      2 dsmith
      1 sjones
0 голосов
/ 17 мая 2018

Только Awk:

awk '
  {sub(/.*username=/,""); sub(/ .*/,"")}
  {a[$0]++}
  END {for(i in a) printf "%d\t%s\n",a[i],i | "sort -nr"}
' file.txt

Здесь используется функция sub() awk для достижения того, что grep -o делает в других ответах.Он встраивает вызов sort в сценарий awk.Конечно, вы можете использовать этот канал после сценария awk, а не внутри него, если хотите.

О, и в отличие от других решений awk, представленных здесь, этот (1) является переносимым для не-GNU-awk сред(например, BSD, macOS) и не зависит от того, какое имя пользователя находится в предсказуемом месте в каждой строке (т. е. $ 2).

Почему awk может быть лучшим выбором, чем более простые инструменты, такие как uniq?Это, вероятно, не так для супер простого требования, как это.Но хорошо иметь в своем наборе инструментов, если вы хотите что-то с возможностью немного больше обработки текста.

0 голосов
/ 17 мая 2018

Использование grep:

$ grep -o 'username=[^ ]*' file | cut -d "=" -f 2 | sort | uniq -c | sort -nr
0 голосов
/ 17 мая 2018

В GNU awk:

$ awk '
BEGIN { RS="[ \n]" }
/=/ {
    split($0,a,"=")
    u[a[2]]++ }
END {
    PROCINFO["sorted_in"]="@val_num_desc"
    for(i in u)
        print u[i],i
}' file
3 jdoe
2 dsmith
1 sjones
0 голосов
/ 17 мая 2018

Использование sed, uniq и sort:

sed 's/.*username=\([^ ]*\).*/\1/' file.txt | sort | uniq -c | sort -nr

Если есть строки без имен пользователей:

sed -n 's/.*username=\([^ ]*\).*/\1/p' input | sort | uniq -c | sort -nr
...