Добавьте первый столбец, если все остальные столбцы совпадают (AWK) - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть файл со следующими данными:

25  POSIX shell script, ASCII text executable
25  POSIX shell script, ASCII text executable
3   PostScript document text conforming DSC level 3.0, type EPS, Level 2
2   PostScript document text conforming DSC level 3.0, type EPS, Level 2
23  PostScript document text conforming DSC level 3.0, type EPS, Level 2
4   SVG Scalable Vector Graphics image
4   SVG Scalable Vector Graphics image

, и я хотел бы суммировать первое поле, если все остальные поля совпадают, поэтому на выходе должно быть:

50  POSIX shell script, ASCII text executable
28  PostScript document text conforming DSC level 3.0, type EPS, Level 2
8   SVG Scalable Vector Graphics image

Я попробовал эту команду awk:

awk '{ a[$2]+=$1 }END{ for(i in a) print a[i],i }' inputfile

, которая печатает:

25 POSIX
28 PostScript
8 SVG

, но я не могу найти способ напечатать остальную часть строки

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019
$ awk '{n=$1; sub(/[0-9]+ +/,""); a[$0]+=n} END{ for(i in a) print a[i],i }' file
28 PostScript document text conforming DSC level 3.0, type EPS, Level 2
50 POSIX shell script, ASCII text executable
8 SVG Scalable Vector Graphics image
0 голосов
/ 07 февраля 2019

Еще один awk с 'sort'

$  sort -k2 sergio.txt | awk  ' { t=$1; $1=""; c=$0;if(c==p) { s+=b} else { if(NR>1) print s+b,p; s=0} p=c;b=t} END { print s+b,p } ' sergio.txt
50  POSIX shell script, ASCII text executable
28  PostScript document text conforming DSC level 3.0, type EPS, Level 2
8  SVG Scalable Vector Graphics image
$

Входной файл:

$ cat sergio.txt
25  POSIX shell script, ASCII text executable
25  POSIX shell script, ASCII text executable
3   PostScript document text conforming DSC level 3.0, type EPS, Level 2
2   PostScript document text conforming DSC level 3.0, type EPS, Level 2
23  PostScript document text conforming DSC level 3.0, type EPS, Level 2
4   SVG Scalable Vector Graphics image
4   SVG Scalable Vector Graphics image
$
0 голосов
/ 06 февраля 2019

Это один из способов:

$ awk '{v=$1;$1="";s[$0]+=v}END{for(i in s)print s[i] i}' file
8 SVG Scalable Vector Graphics image
50 POSIX shell script, ASCII text executable
28 PostScript document text conforming DSC level 3.0, type EPS, Level 2

Объяснено:

$ awk '{
    v=$1              # store value in $1
    $1=""             # empty $1, record gets rebuilt
    s[$0]+=v          # sum indexing on $1less record
}
END {                 # in the end
    for(i in s)       # loop all 
        print s[i] i  # ... and output
}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...