Упражняемся с AWK

Данные структурированы иногда не совсем удобно, или не совсем так как хотелось бы Положение исправит AWK!

Задача стояла в следующем - есть три поля в текстовом файле: 1 - цифры, 2 - текст, 3 - буквенная метка. Второе поле может состоять из нескольких слов, а если не умещается в отведенную ширину, то переносится на следующую строку, где первое и третье поля пустые. Нужно более логично структурировать данные.

Первоначальный текст:

001 Текст в не-       ААА
         сколько
        строк

002 Следующая      ААА
        запись

003  еще одна      ФФФ
     запись на
     стрке не
     одна а две

Придется использовать массивы и условия

Получился скрипт следующего содержания

#!/usr/bin/awk -f
#инициализируем переменную
BEGIN{ tmp=0;}
 
{
#основная часть скрипта
if($1~/^[0-9]+/) { 
#если номер 
 
#сбросим запомненый текст в ячейку массива
        text[tmp]=txt;
        txt="";
#инкрементируем счетчик
        tmp++;
 
#запомним номер(первое поле) 
#и буквенный маркер (последнее поле)
        num[tmp]=$1;
        mark[tmp]=$NF;
#теперь пройдемся по полям 
#от второго до предпоследнего
#и сложим текст каждого из них
#запомнив его в переменной
        for (i=2;i<NF;i++){
                txt=txt " " $i;
        };
 
        }else{
# а если не номер в первом поле
# значит второе поле надо продолжать запоминать
                txt=txt " " $0;
        };
 
}
 
#заключительный этап
END{
#сбросим все что осталось в txt
# в последнюю ячейку массива
 text[tmp]=txt;
 
# и распечатаем данные в новой структуре
        for (i in text){
                print  num[i] "\t" mark[i] "\t" text[i];
        }
}

Теперь снова легче жить:

max@maximus:~$ cat text|./awkscript

001     ААА      Текст в не-          сколько          строк
002     ААА      Следующая         запись
003     ФФФ      еще одна      запись на      стрке не       одна а две
max@maximus:~$                    
Последние изменения: %2010/%03/%22 %01:%Mar