Pomocí 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
Toto nejprve používá grep
získat řádky z fileB.txt
který přesně odpovídá řádkům v fileA.txt
a vypíše odpovídající čísla řádků spolu s řádky samotnými.
Používám -x
a -F
kromě možností, které jsou použity v otázce. Dělám to, abych se vyhnul čtení vzorů z fileA.txt
jako regulární výrazy (-F
), a aby se shodovaly celé řádky, nikoli podřetězce (-x
).
datamash
obslužný program to pak analyzuje jako řádky :
-oddělená pole (-t :
), seřazením (-s
) ve druhém poli (-g 2
; země) a sbalení prvního pole (collapse 1
; čísla řádků) do seznamu pro každou zemi.
Potom byste samozřejmě mohli nahradit dvojtečky a čárky tabulátory pomocí tr ':,' '\t\t'
, nebo s mezerami podobným způsobem.
$ 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
Použijte awk
:
awk 'NR==FNR { country[$0]= country[$0]? country[$0] FS NR: NR; next }
($0 in country){ print $0, country[$0] }' fileB fileA
nebo nahlásit „počet:0 " v případě, že v souboru A byl název země, který se v souboru B neobjevuje, proveďte:
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
Můžete spojit svůj výstup příkazu grep s Millerem (https://github.com/johnkerl/miller) a spustit
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
Budete mít
Germany 4 9
USA 1 2 11
UK 5 6