- []
Упражняемся с 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:~$
программирование/упражняемся.с.awk.txt · Последние изменения: 2010/03/22 01:49 (внешнее изменение)

