Данные структурированы иногда не совсем удобно, или не совсем так как хотелось бы Положение исправит 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:~$