Utilizzo di GNU datamash :
$ grep -n -x -F -f fileA.txt fileB.txt | datamash -s -t : -g 2 collapse 1
Germany:4,9
UK:5,6
USA:1,2,11
Questo prima utilizza grep per ottenere le linee da fileB.txt che corrisponde esattamente alle righe in fileA.txt , e restituisce i numeri di riga corrispondenti insieme alle righe stesse.
Sto usando -x e -F oltre alle opzioni utilizzate nella domanda. Lo faccio per evitare di leggere i modelli da fileA.txt come espressioni regolari (-F ) e per abbinare righe complete, non sottostringhe (-x ).
Il datamash l'utilità lo analizza quindi come righe di : -campi delimitati (-t : ), ordinandolo (-s ) nel secondo campo (-g 2; i paesi) e comprimendo il primo campo (collapse 1; i numeri di riga) in un elenco per ciascun paese.
Ovviamente potresti quindi sostituire i due punti e le virgole con le tabulazioni usando tr ':,' '\t\t' , o con spazi in modo simile.
$ grep -n -x -f fileA.txt -F fileB.txt | datamash -s -t : -g 2 collapse 1 | tr ':,' '\t\t'
Germany 4 9
UK 5 6
USA 1 2 11
Usa awk :
awk 'NR==FNR { country[$0]= country[$0]? country[$0] FS NR: NR; next }
($0 in country){ print $0, country[$0] }' fileB fileA
o per segnalare "count:0 " nel caso ci fosse un countryName nel fileA che non appare nel fileB, fai:
awk 'NR==FNR { country[$0]= country[$0]? country[$0] FS NR: NR; next }
($0 in country){ print $0, country[$0]; next } { print $0, "0" }' fileB fileA
Potresti accoppiare l'output del tuo comando grep con Miller (https://github.com/johnkerl/miller) ed eseguire
grep -nf fileA.txt fileB.txt | \
mlr --c2n --ifs ":" --implicit-csv-header --headerless-csv-output reorder -f 2 then \
nest --implode --values --across-records --nested-fs " " -f 1
Avrai
Germany 4 9
USA 1 2 11
UK 5 6