На данный момент ваш вопрос: «Как мне извлечь из строки '-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
Просто с помощью 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
Или
$ 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