GNU/Linux >> Znalost Linux >  >> Linux

grep výstup z dlouhého na široký

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

Linux
  1. Jak zvýraznit slovo ve výstupu „kočka“?

  2. Jak potlačit výstup z Grepu, aby vrátil pouze stav ukončení?

  3. Linux – sloupec Buffers ve výstupu zdarma?

  1. Rozlišovat Ls na výstupu skripty od binárních souborů?

  2. Odstranění redundance z výstupních sloupců?

  3. Jak převést výstup z grep do cp?

  1. Omezit najít výstup a vyhnout se signálu 13?

  2. Jak mohu odfiltrovat jedinečné výsledky z výstupu grep?

  3. Jak grep ps výstup s hlavičkami