Найти между строк начало и конец: awk с переменными bash и каждый раз добавлять новый абзац - PullRequest
0 голосов
/ 22 декабря 2019

ввод:

xxx word1 xxx xxx
xxx xxxx word2
45
776
8
start
1
2
3
finish
45
3
6

код awk:

awk -v s="startpoint" -v e="finishpoint" '$0~s,$0~e' input >> output.

, этот код прекрасно работает сам по себе. Но когда я соединяюсь с другими, это не работает. Мне нравится начинать новый абзац, поэтому я поставил printf "/n", но он также не работал

awk -v s="start" -v e="finish" 'BEGIN { ORS="" } /#word1/ {gsub(/,/,"",$2); print $2 "\t"} /#word2/ {print $2, "\n"} $0~s,$0~e' input >> output 

вывод:

start 1 2 3 finish

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

start

1

2

3

finish

Ответы [ 2 ]

3 голосов
/ 23 декабря 2019

Почему бы просто не добавить еще одну переменную для использования в качестве переменной флага для управления печатью. (Например, prn=0, затем, если найдено start, установите prn=1 и напечатайте все строки, если prn=1, затем выйдите, когда достигните finish). Например, вы можете сделать следующее:

awk -v s="start" -v e="finish" -v prn=0 '
    BEGIN { ORS="" }
    $0~s { prn=1 }
    prn==1 { printf "%s\n\n", $0 }
    $0~e {exit}
' input

( примечание: было бы проще просто оставить ORS в качестве новой строки)

Пример Использование / Вывод

Просто вставив в командную строку, вы получите:

$ awk -v s="start" -v e="finish" -v prn=0 '
>     BEGIN { ORS="" }
>     $0~s { prn=1 }
>     prn==1 { printf "%s\n\n", $0 }
>     $0~e {exit}
> ' input
start

1

2

3

finish

Что соответствует вашему выводу. (если вам действительно не нужны пустые строки, просто удалите одну из '\n' в операторе printf)

Чтобы найти все start И finish Просто сбросьте prn Отметить ноль

Чтобы не exit после первых finish, но найти все start до finish случаев, вы сбрасываете prn=0, например,

awk 'BEGIN { ORS=""; s="start"; e="finish"; prn=0 }
    $0~s { prn=1 }
    prn==1 { printf "%s\n\n", $0 }
    $0~e { prn=0 }
' input

( примечание: выше, я объединил установку всех переменных в правиле BEGIN, поскольку вы все равно его используете)

Теперь все секции от start до finish будут выводиться вТочно так же.

Дайте мне знать, если вы просите что-то немного другое или у вас есть дополнительные вопросы.

1 голос
/ 23 декабря 2019

Я нашел решение и хотел бы поделиться с вами, ребята.

awk -v s="start" -v e="finish" '$0~s,$0~e {print $0 "\t"}'

Если вы хотите выбрать, какой столбец вы хотите извлечь из текстового файла, вы можете использовать

awk -v s="start" -v e="finish" '$0~s,$0~e {print $1 "\t" $2 "\t" $4 "\t"}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...