Транспонировать текст с помощью sed
Пожалуйста, помогите мне понять, как решить эту проблему, используя sed
,
Учитывая следующий текст:
Керала 4222 8129 8163 8164 Дели 8502 8503 8504 8505 Гоа 1 39 45
Я хочу преобразовать его в следующий формат:
Керала, 4222 Керала, 8129 Керала,8163 Дели, 8502 Дели, 8503 Дели, 8504 Дели, 8505 Гоа, 1 Goa, 39 Goa, 45
1 ответ
Предположим, что ваш файл имеет название 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
Я надеюсь, что это понятно.