Объединить строки по повторяющимся столбцам в awk / unix с условием - PullRequest
1 голос
/ 14 апреля 2020

Как мы можем использовать команду awk / sed / unix для массажа данных. У меня есть данные, как показано ниже:

/abc/def1.0/Acc101 500 50
/abc/def1.0/Acc101 401 27
/abc/def1.0/Acc101 200 101
/abc/def1.0/Acc201 200 4
/abc/def1.0/Acc301 304 2
/abc/def1.0/Acc401 200 204

Для каждой уникальной строки в первом столбце $ 1, как мы можем объединить значение, которое разделено значением. Столбец $ 2 - это код, если его 200 означает успех, отличный от неудачного. $ 3 - это счет вхождения.

Ниже приведен пример выходных данных, поскольку мы различаем 1 долл. США и проверяем значение, которое имеет значение 200 или не 200 в 2 долл. США, и объединяем / суммируем счет в 3 долл. США. Пример, как показано ниже:

/abc/def1.0/Acc101 101 77
/abc/def1.0/Acc201 4 0
/abc/def1.0/Acc301 0 2
/abc/def1.0/Acc401 204 0

Информация для строки: /abc/def1.0/Acc101 101 77

77 = сумма 50 + 27 из $ 3, что равно $ 2! = 200

Большое спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Что-то вроде

awk '{ groups[$1] = 1; if ($2 == 200) succ[$1] += $3; else fail[$1] += $3 }
     END { PROCINFO["sorted_in"] = "@ind_str_asc"
           for (g in groups) print g, succ[g]+0, fail[g]+0 }' input.txt
/abc/def1.0/Acc101 101 77
/abc/def1.0/Acc201 4 0
/abc/def1.0/Acc301 0 2
/abc/def1.0/Acc401 204 0

Если используется GNU awk, строка PROCINFO приведет к отсортированному выводу, в противном случае порядок будет произвольным, и, если вы хотите, чтобы он был отсортирован, его можно передать в sort.

0 голосов
/ 14 апреля 2020

Вы можете прочитать Input_file 2 раза для простоты и попробовать один раз.

awk '
FNR==NR{
  mainarray[$1]
  if($2!=200){
    sum[$1]+=$NF
  }
  if($2==200){
    Found200[$1]+=$NF
  }
  next
}
($1 in mainarray) && !($1 in Found200){
  print $1,0,sum[$1]!=""?sum[$1]:0
  next
}
$2==200{
  print $1,Found200[$1]!=""?Found200[$1]:0,sum[$1]!=""?sum[$1]:0
}
'  Input_file  Input_file

Объяснение: Добавление подробной информации для выше.

awk '                                                           ##Starting awk program from here.
FNR==NR{                                                        ##FNR==NR condition will be TRUE when first time Input_file will be read.
  mainarray[$1]                                                 ##Creating array with index $1 here.
  if($2!=200){                                                  ##Creating array named sumwith index $1 and keep adding last column value in it.
    sum[$1]+=$NF                                                ##Creating array named sumwith index $1 and keep adding last column value in it
  }
  if($2==200){                                                  ##Checking condition if 2nd field is equal to 200 then do following.
    Found200[$1]+=$NF                                           ##Creating array Found200 with index #1and keep adding last column value to its value.
  }
  next                                                          ##next will skip all further statements from here.
}
($1 in mainarray) && !($1 in Found200){                         ##Checking condition if $1 is present in mainarray and $1 is NOT present in Found200 array.
  print $1,0,sum[$1]!=""?sum[$1]:0                              ##Printing first field, zero and value of sum with $1 here.
  next                                                          ##next will skip all further statements from here.
}
$2==200{                                                        ##Checking condition if 3rd field is 200 then do following.
  print $1,$NF!=""?Found200[$1]:0,sum[$1]!=""?sum[$1]:0         ##Printing first field, Found200 vaue with sum value.
}
' Input_file  Input_file                                      ##Mentioning Input_file names here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...