Найти вхождение, затем найти следующее вхождение из сегмента в первом результате

Возможное решение комбинированияseq(генерации диапазонов с выбранным форматом-f--include-from=-(чтения изstdin):

$ ls src/
p.4.31  p.4.32  p.4.42  p.4.45  p.4.46  p.4.54
$ ls dst
$ seq -f "p.4."%g 42 46 | rsync src/* dst/ --include-from=- --exclude=* -v
p.4.42
p.4.45
p.4.46

sent 183 bytes  received 86 bytes  538.00 bytes/sec
total size is 0  speedup is 0.00
$ ls dst/
p.4.42  p.4.45  p.4.46
0
04.11.2019, 21:46
3 ответа

На самом деле очень похоже на решение @Choroba:

awk -F'|'   '/Logged In/                   { login[$1]=$0}     
             /Processed Bill/ && login[$1] { print login[$1]; print}' ex1

Где:

  • /Logged In/ { login[$1]=$0}--сохраняет строки с надписью «Вошел в систему», связанные со столбцом 1 (ex «Журнал1»)
  • /Processed Bil/ && login[$1] {print...}--печатает, когда находит «Обработанный счет» перед входом в систему

Исправление :Для печати только 44:

awk -F'|'   '/Logged In - 44/              { cod=$1; line=$0}     
             /Processed Bill/ && $1==cod   { print line "\n" $0}' file
0
28.01.2020, 02:29

Перл раствор:

perl -F'/\|/' -ne '$id = $F[0] if $F[3] =~ /- 44$/;
                   print if $F[0] eq $id && $F[3] =~ /Logged In|Processed Bill/;
                  ' -- file.txt
  • -nсчитывает ввод построчно
  • -Fразбивает каждую входную строку заданного регулярного выражения на массив @F
  • если $F[3], то есть четвертый столбец, соответствует - 44, первый столбец сохраняется в $id.
  • печатается вся строка, если первый столбец равен $id, а четвертый столбец соответствует Logged Inили Processed Bill.
2
28.01.2020, 02:29

С Gnu sed в расширенном режиме регулярных выражений:

$ sed -re ':a
    /Logged In - 44/!d
    $d;h;N
    /^(\S+)\s*\|.*\n\1\s*\|.*Processed Bill/b
    g;ba
' file

Результаты

Log1 | 20191104 | 04 | Logged In - 44
Log1 | 20191104 | 33 | Processed Bill

Как это работает

° Skip lines till we meet "Logged In 44"
° Pick up the nexr line and if it is "Processed Bill" AND first field matches with the logged in line, then it's a GO.
° Otherwise, discard the second portion and redo this process. 
° Assumption is that logged in 44 line is unique. 
0
28.01.2020, 02:29

Теги

Похожие вопросы