Возможное решение комбинирования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
На самом деле очень похоже на решение @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
Перл раствор:
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
. С 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.