Печать в строках для выбранных greps в последовательности строк - PullRequest
0 голосов
/ 17 июня 2019

У меня есть файл, как показано ниже, с несколькими сотнями строк:

$ cat file1
TAP 1.0
.1.2.3.0 .0.3.2.1.1
.1.2.3.1 .1.3.2.1.1
.1.2.3.2 .2.3.2.1.1
.1.2.3.3 .3.3.2.1.1
.1.2.3.4 .4.3.2.1.1
.1.2.3.5 .5.3.2.1.1
TAP 1.0
.1.2.3.0 .0.3.2.1.2
.1.2.3.1 .1.3.2.1.2
.1.2.3.2 .2.3.2.1.2
.1.2.3.3 .3.3.2.1.2
.1.2.3.4 .4.3.2.1.2
.1.2.3.5 .5.3.2.1.2
TAP 1.0
.1.2.3.0 .0.3.2.1.3
.1.2.3.1 .1.3.2.1.3
.1.2.3.2 .2.3.2.1.3
.1.2.3.3 .3.3.2.1.3
.1.2.3.4 .4.3.2.1.3
.1.2.3.5 .5.3.2.1.3
.....

Из файла выше, мне нужно grep только два ".1.2.3.1" и ".1.2.3.0" и распечатать какниже:

    (( Desired Output))
    .1.3.2.1.1 .0.3.2.1.1 
    .1.3.2.1.2 .0.3.2.1.2 
    .1.3.2.1.3 .0.3.2.1.3     
....

Мой код работает только для поиска определенной строки, как показано ниже: awk:

s1 вывод ниже, где он ищет .1.2.3.1 и выдаёт вывод всехстолбцы, за исключением 1-го столбца, как показано ниже:

command:  s1= cat $file1 | grep -i '.1.2.3.1' | awk '{$1=""; print $0}'
O/P(Output):
.1.3.2.1.1
.1.3.2.1.2
.1.3.2.1.3

Таким же образом s2 выдает выходные данные, как указано выше для grepping .1.2.3.0, как показано ниже:

command: s2= cat $file1 | grep '.1.2.3.0' | awk '{$1=""; print $0}'
O/P:
.0.3.2.1.1
.0.3.2.1.2
.0.3.2.1.3

Итак, полный вывод для s1 и s2будет выглядеть так, как показано ниже, когда я буду работать одновременно ( это не то, что я хочу ):

s1= cat $file1 | grep -i '.1.2.3.1' | awk '{$1=""; print $0}'
s2= cat $file1 | grep '.1.2.3.0' | awk '{$1=""; print $0}'
O/P:
.1.3.2.1.1
.1.3.2.1.2
.1.3.2.1.3
.0.3.2.1.1
.0.3.2.1.2
.0.3.2.1.3

Мне нужен вывод, как показано ниже, как я могу напечатать мой выше какниже: ( Должно быть как показано ниже )

Desired Output:
    .1.3.2.1.1 .0.3.2.1.1
    .1.3.2.1.2 .0.3.2.1.2
    .1.3.2.1.3 .0.3.2.1.3
    .. etc

Вывод должен быть в самом формате "echo $ s1 $ s2", но вывод должен быть таким же, как указано вышенекоторое условие цикла, считывая и печатая одну переменную S1 и S2 за раз, вместо того, чтобы сначала печатать весь S1, а затем весь вывод S2.

Так что мне нужно временно хранить каждую переменную чтения в S1 и S2 и печатать одну за другой в последовательности, как указано выше.

Таким образом, вывод выше будет происходить только тогда, когда он выполняется ниже в сценарии:

- First grepped output of .1.2.3.1 should be kept in variable s1
- First grepped output of .1.2.3.0 should be kept in variable s2
then print both first grepped one's of both temporary string as echo $s1 $s2 as below:
.1.3.2.1.1 .0.3.2.1.1
- Do in the same way for second grepped temporary output for both as below:
.1.3.2.1.2 .0.3.2.1.2
- Do in the same way for all Nth grepped output as below:
.1.3.2.1.1 .0.3.2.1.1
.1.3.2.1.2 .0.3.2.1.2
....
.1.3.2.1.Nth .0.3.2.1.Nth

Для всей последовательности он должен печатать с учетом одного grep за раз вместо всех сгоревших выходных данных.

Что касается вашего лучшего понимания, он лучше работает для одной строки для определенного grepкак показано ниже:

[root@server]$cat file0
.1.2.3.0 .0.3.2.1.1
.1.2.3.1 .1.3.2.1.1
.1.2.3.7 .3.3.2.1.1



[root@server]$ s1=`cat file0 | grep -i '.1.2.3.1' | awk '{$1=""; print $0}'`
[root@server]$ s2=`cat file0 | grep '.1.2.3.0' | awk '{$1=""; print $0}'`
host$ echo $s1 $s2
.1.3.2.1.1 .0.3.2.1.1

Но как это работает для "file1", как "file0", и как я могу напечатать, как указано выше !!

Спасибо!

1 Ответ

0 голосов
/ 23 июня 2019

Вот один awk скрипт, который выполняет задачу:

script.awk

BEGIN {FS = "[\r ]"}     # input line field separator <CR> or <SPACE>
/TAP/ && NR > 1{print output; output = ""} # print output when matched TAP (but not first line), then reset output
/^.1.2.3.[10]/ {output = $2 OFS output} # if matched pattern, left pad 2nd input field to output
END {print output} # print the final outuput

выполняется:

awk -f script.awk input.txt

вывод:

.1.3.2.1.1 .0.3.2.1.1
.1.3.2.1.2 .0.3.2.1.2
.1.3.2.1.3 .0.3.2.1.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...