Linux
grep 輸出從長到寬
我有一個模式文件,我想返回找到該模式的所有行號,但格式較寬且不長/擴展。例子:
文件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