Linux

grep 輸出從長到寬

  • February 15, 2021

我有一個模式文件,我想返回找到該模式的所有行號,但格式較寬且不長/擴展。例子:

文件A.txt

Germany
USA
UK

文件B.txt

USA
USA
Italy
Germany
UK
UK
Canada
Canada
Germany
Australia
USA

我做了這樣的事情:

grep -nf fileA.txt fileB.txt

這讓我回來了:

1:USA
2:USA
4:Germany
5:UK
6:UK
9:Germany
11:USA

但是,我想要類似的東西:

Germany 4 9
USA 1 2 11
UK 5 6

使用 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

這首先用於grep獲取與 中的行fileB.txt完全匹配的行fileA.txt,並輸出匹配的行號以及行本身。

除了問題中使用的選項之外,我還在使用-x和。-F我這樣做是為了避免從fileA.txt正則表達式 ( -F) 中讀取模式,並匹配完整的行,而不是子字元串 ( -x)。

然後,datamash實用程序將其解析為以 - 分隔的欄位 ( ) 行:,在第二個欄位 ( ; the countries ) 上對其進行-t :排序 ( )並將第一個欄位 ( ; 行號) 折疊成每個國家/地區的列表。-s``-g 2``collapse 1

然後,您顯然可以使用製表符替換冒號和逗號tr ':,' '\t\t',或者以類似的方式使用空格。

$ 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

引用自:https://unix.stackexchange.com/questions/634364