Преобразовать шаблон столбца - PullRequest
2 голосов
/ 13 января 2012

У меня есть такой файл:

1 0 1

2 0 3
2 1 2

3 0 3

4 0 1
4 1 1
4 2 1
4 3 1

5 0 1



8 0 1


10 0 1

11 0 1

Разделитель RS по умолчанию является пустой строкой.

Если была двойная пустая строка, мы должны заменить ихпо шаблону $1 0 0, где $1 означает увеличенное "число" перед записью $1 0 *.

Если разделитель равен empty line + 1 empty line, мы должны увеличить 1 доллар на 1. Если разделитель равенempty line + 2 empty line нам нужно увеличить $ 1 на 2. ...

, и мне нужно получить этот вывод:

1 0 1

2 0 3
2 1 2

3 0 3

4 0 1
4 1 1
4 2 1
4 3 1

5 0 1

6 0 0 

7 0 0

8 0 1

9 0 0

10 0 1

11 0 1

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 14 января 2012
awk 'NF{f=0;n=$1;print;next}f{print ++n " 0 0"}{print;f=1}' ./infile

выход

$ awk 'NF{f=0;n=$1;print;next}f{print ++n " 0 0"}{print;f=1}' ./infile
1 0 1

2 0 3
2 1 2

3 0 3

4 0 1
4 1 1
4 2 1
4 3 1

5 0 1

6 0 0

7 0 0

8 0 1

9 0 0

10 0 1

11 0 1

Объяснение

  • NF{f=0;n=$1;print;next}: если текущая строка содержит данные, снимите флажок f, сохраните число в первом поле в n, напечатайте строку и пропустите оставшуюся часть сценария
  • {print;f=1}: Мы достигаем этого действия, только если текущая строка пуста. Если это так, выведите строку и установите флаг f
  • f{print ++n " 0 0"}: Мы выполняем это действие, только если установлен флаг f, что происходит только в том случае, если предыдущая строка была пустой. Если мы введем это действие, напечатайте пропущенные поля с увеличенным n
3 голосов
/ 14 января 2012

Вы можете попробовать что-то вроде этого. Преимущество этого способа заключается в том, что ваш входной файл не должен содержать пустую строку для пропущенных чисел.

awk -v RS="" -v ORS="\n\n" -v OFS="\n" '                   
BEGIN{getline; col=$1;line=$0;print line}
$1==col{print $0;next }
($1==col+1){print $0;col=$1;next}
{x=$1;y=$0; col++; while (col < x) {print col" 0 0";col++};print y;next}' file 

Входной файл:

[jaypal:~/Temp] cat file
1 0 1

2 0 3
2 1 2

3 0 3

4 0 1
4 1 1
4 2 1
4 3 1

5 0 1



8 0 1


10 0 1

11 0 1

Вывод скрипта:

[jaypal:~/Temp] awk -v RS="" -v ORS="\n\n" -v OFS="\n" '                   
BEGIN{getline; col=$1;line=$0;print line}
$1==col{print $0;next }
($1==col+1){print $0;col=$1;next}
{x=$1;y=$0; col++; while (col < x) {print col" 0 0";col++};print y;next}' file
1 0 1

2 0 3
2 1 2

3 0 3

4 0 1
4 1 1
4 2 1
4 3 1

5 0 1

6 0 0

7 0 0

8 0 1

9 0 0

10 0 1

11 0 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...