-3

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

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

Kerala
        4222        8129        8163        8164        

Delhi      
        8502        8503        8504        8505       
Goa
        1          39      45

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

Kerala,4222
Kerala,8129
Kerala,8163
Delhi,8502
Delhi,8503
Delhi,8504
Delhi,8505
Goa,1
Goa,39
Goa,45

1 ответ1

0

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

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

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

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

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

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

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

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

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

for num in "${numbers2[@]}"; do echo "$var,$num"; done

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .