Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Как используя sed/awk сделать такое...  (Прочитано 755 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Andx

  • Автор темы
  • Участник
  • *
  • Сообщений: 160
  • Привет, Земляне!
    • Просмотр профиля
Добрый день! Подскажите пожалуйста, как используя sed, изменить большой текстовый файл такого вида:
Цитировать
0032^hkcap1.jpg
0032^hkcap2.jpg
0032^hkcap3.jpg
02-532^3b47b3e2.jpg
2232^2232_1lego.jpg
24984H^16032012_24984H_b.jpg
28706H^97203242-6cb0-11e0-96cd-001517d82894_1.resize1.jpg
28706H^97203242-6cb0-11e0-96cd-001517d82894_2.jpg
28706H^97203242-6cb0-11e0-96cd-001517d82894_3.jpg
28706H^97203242-6cb0-11e0-96cd-001517d82894_4.jpg

Знак ^ это разделитель столбцов. Нужно чтобы на выходе было такое содержание: строка первого столбца становится в одном экземпляре, если их было несколько, как хорошо видно с 28706H, а все его картинки располагаются в одну строку через запятую:
Цитировать
0032^hkcap1.jpg,hkcap2.jpg,hkcap3.jpg
02-532^3b47b3e2.jpg
2232^2232_1lego.jpg
24984H^16032012_24984H_b.jpg
28706H^97203242-6cb0-11e0-96cd-001517d82894_1.resize1.jpg,97203242-6cb0-11e0-96cd-001517d82894_2.jpg,97203242-6cb0-11e0-96cd-001517d82894_3.jpg,97203242-6cb0-11e0-96cd-001517d82894_4.jpg
« Последнее редактирование: 20 Апреля 2014, 11:39:34 от Andx »
Asus K73E (Core i3 2310M/8gb ram/500gb/Intel HD Graphics 3000/HD audio/WIFI & BT/Ubuntu 12.04 64bit)
Живём правильно только тогда, когда после нас остаются чистые вода, воздух и земля.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Как используя sed сделать такое...
« Ответ #1 : 19 Апреля 2014, 12:39:31 »
Строки первого столбца идут по порядку (вместе) или разбросаны по всему тексту? (боюсь что одним лишь sed не обойтись. Почему не awk ?)
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Re: Как используя sed сделать такое...
« Ответ #2 : 19 Апреля 2014, 12:59:00 »
Сначала sort -n наложить на этот текст, а потом sed awk
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Как используя sed сделать такое...
« Ответ #3 : 19 Апреля 2014, 14:39:27 »
Если отсортировано (см.выше sort -n) то на awk:
Код: (bash) [Выделить]
awk -F^ ' BEGIN { OFS="^" } NR == 1 { a = $1 ; b = $2 } NR != 1 { if ( a != $1 ) { print a,b ; a = $1 ; b = $2 } else b = b "," $2 } END { print a,b }' file.txt
Пользователь решил продолжить мысль 19 Апреля 2014, 14:49:03:
Или оптимизированный вариант
Код: (bash) [Выделить]
awk -F^ '{ if (a!=$1) { if (b!="") print b ; a=$1 ; b=a"^"$2 } else b=b","$2 } END {print b}' file.txt 
« Последнее редактирование: 19 Апреля 2014, 14:49:03 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Andx

  • Автор темы
  • Участник
  • *
  • Сообщений: 160
  • Привет, Земляне!
    • Просмотр профиля
Re: Как используя sed сделать такое...
« Ответ #4 : 20 Апреля 2014, 11:38:55 »
большое спасибо! Azure, сработало отлично!
Asus K73E (Core i3 2310M/8gb ram/500gb/Intel HD Graphics 3000/HD audio/WIFI & BT/Ubuntu 12.04 64bit)
Живём правильно только тогда, когда после нас остаются чистые вода, воздух и земля.

 

Страница сгенерирована за 0.034 секунд. Запросов: 22.