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