KSH: разделить строку на более мелкие подстроки в зависимости от количества

KSH HP-SOL-Lin Не может использовать xAWK

У меня есть несколько довольно длинных строк, и я хочу разбить их на более мелкие подстроки.

Что я имею

String = "word1 word2 word3 word4 .....wordx"

Что я хочу

String1="word1 word2"
String2="word3 word4"
String3="word4 word5"
Stringx="wordx wordx+1"
etc.....

Как я могу разбить это на то, где, если моя строка длиннее x слов, разбить на более мелкие строки не длиннее x? Я понятия не имею, какой длины будет каждая строка. Мы можем проверить это, но это не будет последовательным.

StrLen=`echo $string |wc -w`

Некоторые строки длиннее 2000 слов, поэтому я не могу использовать массив оболочки, так как максимальное количество полей составляет 1024.

идеи?

Вот что я придумал на основе комментариев ниже

FIELDS=`echo $String | wc -w`
((n=$FIELDS/2+1))
i=1

while [[ $i -le $n ]]; do
typeset STRING$i=`echo $String | cut -d" " -f$CUTSTART-$CUTEND`
do stuff

i=`expr $i+1`
CUTSTART=`expr $CUTSTART+1`
CUTEND=`expr $CUTEND+1`
done

Кажется, все еще есть проблемы с набранной частью. Предположения

i=1
CUTSTART=1
CUTEND=2
String=one two three

myserver> typeset STRING=`echo $String | cut -d" " -f$CUTSTART-$CUTEND`
myserver> echo $STRING
myserver> one two
myserver>
myserver> typeset STRING$i=`echo $String | cut -d" " -f$CUTSTART-$CUTEND`
myserver> echo $STRING1
myserver> one

в чем проблема, когда $i испортил мою команду echo|cut?


person nitrobass24    schedule 19.09.2012    source источник
comment
ваш ksh отвечает на echo ${.sh.version} ? Если нет, посмотрите, можете ли вы найти ksh93 или dtksh. Я думаю, что это дает вам больше гибкости в отношении размера массива (не уверен). Удачи.   -  person shellter    schedule 20.09.2012
comment
@shelter вот результат Version AJM 93t+ 2010-02-02   -  person nitrobass24    schedule 20.09.2012
comment
Tnx для информации о версии ksh. Что вы имеете в виду в своем описании первой строки, не может использовать xAWK? гавк не установлен? а как насчет обычного awk? Это будет однострочник, если вы можете использовать awk. ИЛИ говоря, что вы ограничены 1024 элементами массива, звучит как числовое обозначение массива. Вы можете использовать числа в качестве ключей для сопоставления массивов. Я бы удивился, если бы там был предел. Тогда вам просто нужно управлять массивом извне с помощью числа, но в виде строки в массиве assoc. т.е. typeset -A assocArr; assocArr["$((++i))"]="wrd1". Извините, есть 2 отпуска. удачи.   -  person shellter    schedule 20.09.2012


Ответы (1)


Вот цикл, который использует read для извлечения двух слов за раз:

# Take advantage of the fact that ksh doesn't execute
# read in a subshell.
i=1
String="one two three four five six seven eight"
while echo $String | read w1 w2 w3; do
    typeset "String$i=$w1 $w2"
    if [ -z $w3 ]; then
        break;
    fi
    String=$w3
    let i=i+1
done
echo $String1
echo $String2
echo $String3
# etc.
person chepner    schedule 19.09.2012
comment
Я не понимаю этого? похоже, что это будет печатать только первые два поля/слова каждой строки. Мне нужно вытащить всю строку в подстроки из 2 слов - person nitrobass24; 19.09.2012
comment
Команду typeset можно использовать для динамического создания переменной. После создания цикла у вас должен быть ряд переменных String1, String2 и т. д., доступных для использования. - person chepner; 19.09.2012
comment
Я обновил свой ОП с помощью временного решения, основанного на этом наборе текста... было слишком сложно опубликовать его в качестве комментария. - person nitrobass24; 20.09.2012
comment
Что именно в этом решении вам не подходит? Он создает именно тот набор переменных, который вы просили. Обратите внимание, что я цитирую весь аргумент typeset, что кажется необходимым, чтобы избежать упоминания проблемы в вашем обновлении. - person chepner; 20.09.2012