Если ваши входные файлы слишком велики, чтобы поместиться в памяти, вы можете создать набор пар тег-значение из каждой строки тег-значения в каждом входном файле, например:
$ awk 'BEGIN{FS=OFS=";"} {tag=$0; sub(/ [^; ]+(;.*|$)/,"",tag); sub(/[^;]+ /,""); for (i=1;i<=NF;i++) print tag, $i}' file2
test1;polo
test1;angus
test2;mike
test4;bob
test4;janet
1332240_44557576_CONTI Mazed & Micro kjd $353.50_30062020_lsdf3_some-rule;232324L
1332240_44557576_CONTI Mazed & Micro kjd $353.50_30062020_lsdf3_some-rule;343223432H
, а затем использовать стандартные UNIX инструменты, такие как sort и comm, чтобы получить нужные различия, а затем рекомбинировать с awk в исходные значения тегов. Вот как все это может работать:
$ cat tst.sh
#!/usr/bin/env bash
separate() {
awk '
BEGIN { FS=OFS=";" }
{
tag = $0
sub(/ [^; ]+(;.*|$)/,"",tag)
sub(/[^;]+ /,"")
for (i=1; i<=NF; i++) {
print tag, $i
}
}
' "${@:--}" | sort
}
combine() {
awk '
BEGIN { FS=OFS=";" }
$1 != prev {
printf "%s%s", ors, $1
prev = $1
ors = ORS
ofs = " "
}
{
printf "%s%s", ofs, $2
ofs = OFS
}
END {
printf "%s", ors
}
' "${@:--}"
}
comm -23 <(separate "$1") <(separate "$2") | combine
.
$ ./tst.sh file1 file2
1332239_44557576_CONTI Lased & Micro kjd $353.50_30062020_lsdf3_no-rule 343323H;343343432H;343434311H;454656556H
1332240_44557576_CONTI Mazed & Micro kjd $353.50_30062020_lsdf3_some-rule 2226556H
test1 marco
test2 liza;zen
test3 alan;harry;tom
test4 june
и если вы в будущем захотите найти пары тег-значение в file2, но не в file1 или в обоих тогда вы просто измените comm -23
на comm -13
или comm -12
.