удалить повторяющиеся записи в одном столбце и линеаризовать значения в нескольких строках в одну строку

На данный момент ваш вопрос: «Как мне извлечь из строки '-ip' в следующее пространство? ". На это отвечают следующие команды.

sed -e 's /^.*- ip \ ([^] * \). * $ / \ 1 /'

По сути, он говорит «любое количество символов без пробелов»: [^] *

$ echo "sdf sfdi -ip 192.168.1.1 sdf eret" | sed -e 's /^.*- ip \ ([^] * \). * $ / \ 1 /' 192.168.1.1

2
15.09.2017, 15:09
2 ответа

Просто с помощью awk:

awk '{ r=$0; sub($1,"",r); a[$1]=(a[$1])? a[$1]"\t"r : r }
     END{ for(i in a) { gsub(/[[:space:]]{2,}/," ",a[i]); print i,a[i] } }' file

  • r=$0-захват копии записи

  • sub($1,"",r)-удаление 1-го поля копии для сохранения остальных полей в переменной r

  • a[$1]=(a[$1])? a[$1]"\t"r : r-накопление значений для той же группы (, представленной 1-м полем)

  • for(i in a)-перебор всех сгруппированных элементов

  • gsub(/[[:space:]]{2,}/," ",a[i])-удаление лишних пробелов между словами

  • print i,a[i]-распечатать имя группы и ее значения


Выход:

DAPPUDRAFT_194440  Phosphorous Temperature 
DAPPUDRAFT_196694  Salinity
DAPPUDRAFT_194512  Fishkairomones Cadmium Zinc Quantumdots
DAPPUDRAFT_194472  Phosphorous Fishkairomones Temperature 
DAPPUDRAFT_196131  Salinity Phosphorous hypoxia 
DAPPUDRAFT_195644  Salinity Phosphorous 
2
27.01.2020, 22:09

Или

$ perl -e 'while(<ARGV>){chomp;($x,$y)=split(/\s+/,$_,2);$hash{$x}.=$y;}for(keys %hash){print "$_ $hash{$_}\n";}' test1
DAPPUDRAFT_196694 Salinity
DAPPUDRAFT_194440 Phosphorous     Temperature
DAPPUDRAFT_195644 Salinity        Phosphorous
DAPPUDRAFT_194472 Phosphorous Fishkairomones  Temperature
DAPPUDRAFT_194512 Fishkairomones      Cadmium Zinc    Quantumdots
DAPPUDRAFT_196131 Salinity        Phosphorous     hypoxia
0
27.01.2020, 22:09

Теги

Похожие вопросы