Прочитайте файл и на основе условия выполните некоторую операцию записи

Я новичок в awk. Я искал все, чтобы понять это сам, и потерпел неудачу. Это было мое последнее средство. Пожалуйста помоги.

У меня есть очень большой файл:

*SET
     7
636322    635890    632043    632044
636323    636322    632044    632045
*SET
     8
636315    636323    632045    632046
*SET
     9
635890    635889    635992    635994
635994    635992    635991    635993
635995    635991    635992    635996
635996    635992    635889    635888

Я хотел бы, чтобы это выглядело так

1    636322    635890    632043    632044
1    636323    636322    632044    632045
2    636315    636323    632045    632046
3    635890    635889    635992    635994
3    635994    635992    635991    635993
3    635995    635991    635992    635996
3    635996    635992    635889    635888

В основном есть условие для поиска строки «SET» и пропуска строки, добавления идентификатора счетчика в первый столбец, печати оставшейся части строки, продолжающейся до тех пор, пока она не увидит следующий «SET». Продолжайте до конца файла. Заранее спасибо.


person user3407822    schedule 11.03.2014    source источник
comment
Что происходит со строками с 7, 8 и 9?   -  person Barmar    schedule 12.03.2014
comment
О, пожалуйста, не обращайте внимания на пустые строки в моей заметке. По какой-то странной причине, когда я попытался удалить пустую строку, строка с одиночными цифрами начала объединяться со строкой со строкой SET :-( В моем файле, где я буду манипулировать этим, нет пустых строк. Извините за путаница.   -  person user3407822    schedule 12.03.2014
comment
Узнайте, как делать разметку в SO. Если вы хотите опубликовать буквальный текст или код, отметьте его мышью и используйте инструмент кода {}.   -  person Barmar    schedule 12.03.2014
comment
Строки с отступом в 4 пробела представляют собой буквенный код.   -  person Barmar    schedule 12.03.2014
comment
Спасибо за совет @Barmar. Я учусь.   -  person user3407822    schedule 12.03.2014


Ответы (2)


Делайте это поэтапно.

Во-первых, разберитесь с увеличением счетчика. шаблон, который вы хотите сопоставить, - «SET», поэтому определите переменную в блоке BEGIN и увеличьте ее, когда найдете шаблон «SET».

BEGIN {
cntr=1
}

/SET/ {
   cntr++;
   echo cntr;
}

Затем посмотрите, совпадают ли другие важные строки во входных данных. Не беспокойтесь о пустых строках — если они не соответствуют ни одному из заданных вами шаблонов, ничего не произойдет.

Другие ваши строки соответствуют шаблону: «начало строки» «номер».

$0 на языке awk означает «вся строка, соответствующая текущему шаблону».

Когда вы встречаете одну из этих строк, вы хотите вывести cntr и $0.

Надеюсь, что этого достаточно, чтобы помочь вам разобраться, пока вы узнаете немного больше об awk.

person Angst    schedule 11.03.2014
comment
Не уверен, как это должно решить проблему OP. Что здесь делает echo? - person Jotne; 12.03.2014
comment
Понятно. На самом деле в моем файле вообще нет пустых строк. Мне пришлось добавить их в свою заметку здесь, чтобы предотвратить объединение двух строк по какой-то причине. Я получил то, что вы предложили. Как я могу игнорировать строку, которая находится сразу после /SET/. Спасибо. - person user3407822; 12.03.2014
comment
Я думаю, что ответ Бармара охватывает все это. В awk, если строка не соответствует шаблону, для нее ничего не происходит. - person Angst; 13.03.2014

person    schedule
comment
Большое спасибо, Бармар. Пропустит ли это строку после того, как найдет /SET/? - person user3407822; 12.03.2014
comment
Он игнорирует все строки, кроме строк с SET и строк с NF == 4. - person Barmar; 12.03.2014