パターンファイルがあり、パターンが見つかったすべての行番号を長い形式/散在形式ではなく、広い形式で返したいと思います。例:
ファイル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
ベストアンサー1
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
andも使用します。私は正規表現()からパターンを読み取ることを防ぎ、-F
部分文字列()ではなく行全体を一致させるためにこれをしました。fileA.txt
-F
-x
次に、datamash
ユーティリティはそれを:
--区切りフィールド(-t :
)で構成される行に解析し、-s
2番目のフィールド(;国)-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