Вот Perl-решение:
$ perl -pe 's/(\d+:.*?)(?=\d+:|$)/$1\n/g' file
random_string
83: some words
45: large error report
326: send emails to certain peple
random_string
34: some words
143: job success
(\d+:.*?)
:соответствует одному или нескольким числам (\d+
), за которыми следует :
, а затем наименьшая строка (?
в .*?
делает ее не-жадной, она остановится, как только появится первая найдено совпадение ), соответствующее остальной части регулярного выражения. Здесь это будет продолжаться до части, описанной ниже. (?=\d+:|$)
:(?=foo)
называется положительным прогнозом . Он будет совпадать, но то, что совпало, не будет включено в фактический результат. Таким образом, bar(?=foo)
будет соответствовать всем случаям bar
, за которыми следует foo
. Здесь мы ищем либо строку чисел, за которой следует :
(\d+:
), либо конец строки ($
). Теперь оператор подстановки заменит все вхождения первого шаблона на себя и новую строку, что должно дать вам желаемый результат.
с помощью Миллера(https://github.com/johnkerl/miller)можно запустить
mlr --headerless-csv-output --csv join --lp l_ --rp r_ -f input_01.csv -j Column2 then \
cut -f Column2,l_Column3,r_Column3 then \
filter '$l_Column3!=$r_Column3' \
input_02.csv
для получения
Demopod2,<none>,20fd5948a80c5b06989f34b1c23a8e64afb7943e
Demopod4,ca9802f0636c23d20daad17498b26df000205626,551fbe73e835528da8269bac3652c6a64ecf4097
Некоторые примечания:
join --lp l_ --rp r_ -f input_01.csv -j Column2
для установки соединения и имени суффикса поля вывода cut -f Column2,l_Column3,r_Column3
для извлечения столбца 2 и левого и правого столбца 3 filter '$l_Column3!=$r_Column3'
для фильтрации всех строк, где левый столбец 3 не равен правому столбцу 3 awk -F',' '{
if (NR==FNR) a[$1$2]=$3
else if (a[$1$2]!="" && a[$1$2]!=$3) print $2","a[$1$2]","$3
}' file1 file2
Когда первый файл будет обработан, сохраните значение третьего поля в массиве a
с первым и вторым полем в качестве ключа.
При обработке второго файла сравните, существует ли не -пустое значение массива для ключа, который не соответствует значению третьего поля. Если это так, напечатайте второе поле, значение массива и третье поле.