Как исправить «для утверждения» внутри команды awk в bash - PullRequest
0 голосов
/ 24 сентября 2018

Я хотел бы найти строку, содержащую «автора» и заменить на «s #», а затем распечатать остаток строки.Затем распечатайте между «data» и «end», и, пожалуйста, взгляните на код и расскажите, как правильно использовать оператор внутри команды awk.

#!/bin/bash
defdatano=6
for datano in $(eval seq 0 1 $(($defdatano - 1)))
do
   { echo $datano 
     awk '/#DATA'$(($datano - 1))'/,/#END/{print;next}; /#AUTHORS/ { sub ("#AUTHORS" , "s'$datano' "); print}' DataInput >> DataOutput }
done

Ввод:

REF
TDC
AUTHORS A1
REF
OLD
REF
DATA1
1
2
3
4
5
END
REF
OEF
AUTHORS A2
REF
REF
DATA2
6
7
8
9
10
END

Желаемый вывод:

s0 A1
DATA1
1
2
3
4
5
END
s1 A2
DATA2
6
7
8
9
10
END

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018
$ awk 'sub(/AUTHORS/,"s"c+0){print;c++} /DATA/{f=1} f{print} /END/{f=0}' file
s0 A1
DATA1
1
2
3
4
5
END
s1 A2
DATA2
6
7
8
9
10
END

Исходя из этого и других ваших недавних вопросов, вы, похоже, не понимаете, что такое shell (инструмент для последовательности вызовов других инструментов и манипулирования файлами и процессами) vs awk (стандартный инструмент UNIX для универсального манипулирования текстоминструмент, вызываемый оболочкой, когда необходимо манипулировать текстом) и, в частности, что такое awk и как его использовать.Я настоятельно рекомендую вам приобрести книгу Арнольда Роббинса «Эффективное программирование в Awk», 4-е издание.

0 голосов
/ 24 сентября 2018

Дайте этому однострочнику попробовать:

awk '/^AUTHORS/{$1="s"i++}/^REF/{next}7' file

тест с вашими данными:

kent$  cat f
REF
AUTHORS A1
REF
REF
DATA1
1
2
3
4
5
END
REF
AUTHORS A2
REF
REF
DATA2
6
7
8
9
10
END

kent$  awk '/^AUTHORS/{$1="s"i++}/^REF/{next}7' f
s0 A1
DATA1
1
2
3
4
5
END
s1 A2
DATA2
6
7
8
9
10
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...