объединить вторые поля при совпадении первых

объединить вторые поля при совпадении первых

27.08.2016 05:28:49 Просмотров 19 Источник

Имеются строки:

vmwVmMAC.43      0:50:56:96:5b:63
vmwVmMAC.44      0:50:56:96:4d:20
vmwVmMAC.45      0:50:56:b7:1b:32
vmwVmMAC.45      0:50:56:b7:2b:4b

Как их преобразовать к такому виду, объединив вторые поля при совпадении первых полей:

vmwVmMAC.43      0:50:56:96:5b:63
vmwVmMAC.44      0:50:56:96:4d:20
vmwVmMAC.45      0:50:56:b7:1b:32 , 0:50:56:b7:2b:4b

Требуется инструмент, которому можно передавать исходные строки через «трубу» (pipe):

$ cat file | merge --by -f1 -d'\t'
У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/560044/%d0%be%d0%b1%d1%8a%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8%d1%82%d1%8c-%d0%b2%d1%82%d0%be%d1%80%d1%8b%d0%b5-%d0%bf%d0%be%d0%bb%d1%8f-%d0%bf%d1%80%d0%b8-%d1%81%d0%be%d0%b2%d0%bf%d0%b0%d0%b4%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bf%d0%b5%d1%80%d0%b2%d1%8b%d1%85#comment727434_560044
@alexolut, предложите более удачный перевод.
https://ru.stackoverflow.com/questions/560044/%d0%be%d0%b1%d1%8a%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8%d1%82%d1%8c-%d0%b2%d1%82%d0%be%d1%80%d1%8b%d0%b5-%d0%bf%d0%be%d0%bb%d1%8f-%d0%bf%d1%80%d0%b8-%d1%81%d0%be%d0%b2%d0%bf%d0%b0%d0%b4%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bf%d0%b5%d1%80%d0%b2%d1%8b%d1%85#comment727436_560044
@alexanderbarakin канал или конвейер, например.
https://ru.stackoverflow.com/questions/560044/%d0%be%d0%b1%d1%8a%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8%d1%82%d1%8c-%d0%b2%d1%82%d0%be%d1%80%d1%8b%d0%b5-%d0%bf%d0%be%d0%bb%d1%8f-%d0%bf%d1%80%d0%b8-%d1%81%d0%be%d0%b2%d0%bf%d0%b0%d0%b4%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bf%d0%b5%d1%80%d0%b2%d1%8b%d1%85#comment727591_560044
Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа).
https://ru.stackoverflow.com/questions/560044/%d0%be%d0%b1%d1%8a%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8%d1%82%d1%8c-%d0%b2%d1%82%d0%be%d1%80%d1%8b%d0%b5-%d0%bf%d0%be%d0%bb%d1%8f-%d0%bf%d1%80%d0%b8-%d1%81%d0%be%d0%b2%d0%bf%d0%b0%d0%b4%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bf%d0%b5%d1%80%d0%b2%d1%8b%d1%85#comment730598_560044
это было переведно Александром с крайне убогого руглиша :) Я был уверен, что есть способ сделать это одним пайплайном с каким-нибудь sed-ом :) Но и так хорошо работает, для моих задач сойдет, спасибо

Ответы - объединить вторые поля при совпадении первых / объединить вторые поля при совпадении первых

Является ответом!
aleksandr barakin

27.08.2016 08:23:44

можно это сделать, например, с помощью небольшой программы для интерпретатора awk:

BEGIN {
  OFS="";
}

{ 
  if (NR==1) {
    k="";
  } else {
    if (n==$1) { 
      if (k!="") k=k" , ";
    } else {
      print n,"\t",k;
      k="";
    }
  }
  n=$1;
  $1="";
  k=k$0;
}

END {
  print n,"\t",k;
}

вызывать эту программу, сохранив её в файл программа.awk, можно так:

$ awk -f программа.awk file

или так:

$ cat file | awk -f программа.awk

пример работы:

$ cat file
1   a
1   b
2   c
3   d
3   e
3   f
$ cat file | awk -f программа.awk 
1   a , b
2   c
3   d , e , f
Закрыть X