Транспонировать текст с помощью sed

328
jamsheer np

Пожалуйста, помогите мне понять, как решить эту проблему, используя sed.

Учитывая следующий текст:

Керала 4222 8129 8163 8164   Дели  8502 8503 8504 8505  Гоа 1 39 45 

Я хочу преобразовать его в следующий формат:

Керала, 4222 Керала, 8129 Керала, 8163 Дели, 8502 Дели, 8503 Дели, 8504 Дели, 8505 Гоа, 1 Goa, 39 Goa, 45 
-3
Должно ли это быть `sed`, а не` awk` (или `perl`,` python` и т. Д.)? RedGrittyBrick 8 лет назад 0
Добро пожаловать в Superuser! Вы должны знать, что вопросы здесь, как правило, должны демонстрировать исследовательские усилия, поэтому, вероятно, в настоящее время они подвергаются отрицательному голосованию. SU не является сервисом написания скриптов; Если вы покажете некоторые шаги, которые вы предприняли, мы можем помочь вам повторить их. Обязательно прочитайте [справочный центр] (http://superuser.com/help/asking), чтобы понять, что здесь ожидается. Mikey T.K. 8 лет назад 0

1 ответ на вопрос

0
kristian

Предположим, что ваш файл имеет название test1

Вся команда выглядит так (в одну строку):

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") && names2=($) && for var in "$"; do numbers=$(cat test1 | sed -n "/$var/" | sed "s/\s/;/g"); numbers2=($); for num in "$"; do echo "$var,$num"; done; done 

Для лучшего просмотра посмотрите на этот скрипт:

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g")  names2=($) for var in "$"; do  numbers=$(cat test1 | sed -n "/$var/" | sed "s/\s/;/g") numbers2=($) for num in "$"; do  echo "$var,$num" done done 

Теперь я хочу описать все части команды

ОПИСАНИЕ КОМАНДЫ

Команда names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g")дает мне список имен, разделенных точкой с запятой, в вашем случае Kerala;Delhi;Goa. Я хочу их в этой форме, потому что теперь я могу изменить их в массив с помощью второй команды names2=($). Теперь я перебираю все имена, что делается с помощью первого forцикла.

Команда numbers=$(cat test1 | sed -n "/$var/" |sed "s/\s/;/g");дает мне номера для текущей переменной $var. Т.е. для Keralaэтого было бы 4222;8129;8163;8164. Поведение такое же, как и в первой команде: я хочу изменить их в массив, чтобы я мог их перебирать, что делается с помощью следующей команды numbers2=($);. Теперь я перебираю числа и печатаю их на экране

for num in "$"; do echo "$var,$num"; done 

Надеюсь это понятно.

Это работает ... Большое спасибо за ваш своевременный ответ ... jamsheer np 8 лет назад 0

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