Добавление чисел, присутствующих в похожих строках файла в bash - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть такой файл:

[host]$ cat /tmp/data
Breakfast 1
Lunch 1
Dinner 1
Dinner 1
Dinner 1
Lunch 1
Lunch 1
Dinner 1

Я хочу выводить как:

Breakfast 1
Lunch 3
Dinner 4

Как я могу сделать это с помощью сценариев командной строки awk / sed?

После выполнения следующей команды я получил:

[host]$ cat /tmp/data | sort | tr " " "\n"
Breakfast
1
Dinner
1
Dinner
1
Dinner
1
Dinner
1
Lunch
1
Lunch
1
Lunch
1

Я застрял в том, как теперь добавить эти числа.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Не могли бы вы попробовать следующее, это даст вам вывод в том же порядке, в котором 1-е поле занято в Input_file.

awk '!a[$1]++{b[++count]=$1} {c[$1]++} END{for(i=1;i<=count;i++){print b[i],c[b[i]]}}' Input_file

Вывод будет следующим.

Breakfast 1
Lunch 3
Dinner 4

Объяснение: Теперь добавим объяснение вышеприведенного кода.

awk '
!a[$1]++{                    ##Checking condition if current lines first field is having only 1 count in array a then do following.
  b[++count]=$1              ##Creating an array named b whose index is variable count whose value is increasing number by 1 and value is $1.
}
{
  c[$1]++                    ##Creating an array named c whose index is $1 with increment value by 1.
}
END{                         ##Starting END block of awk code here.
  for(i=1;i<=count;i++){     ##Starting a for loop from i=1 to till value of count here.
    print b[i],c[b[i]]       ##Printing value of array b whose index is variable i and printing value of array c whose index is value of array b.
  }
}'  Input_file               ##Mentioning Input_file name here.
0 голосов
/ 01 декабря 2018

Поскольку число в каждой строке ввода всегда 1, вы можете игнорировать его:

$ sort file | uniq -c | awk '{print $2, $1}'
Breakfast 1
Dinner 4
Lunch 3

или отсортировать по количеству вхождений:

$ sort file | uniq -c | sort -n | awk '{print $2, $1}'
Breakfast 1
Lunch 3
Dinner 4
0 голосов
/ 01 декабря 2018
awk '{a[$1]+=$2} END{for(i in a){print i, a[i]}}' /tmp/data
Dinner 4
Breakfast 1
Lunch 3
...