GNU/Linux >> Linux の 問題 >  >> Linux

ロングからワイドへのgrep出力

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 ユーティリティは、これを : の行として解析しています で区切られたフィールド (-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

awk を使用 :

awk 'NR==FNR        { country[$0]= country[$0]? country[$0] FS NR: NR; next }
     ($0 in country){ print $0, country[$0] }' fileB fileA

または「カウント:0」と報告するには " fileA にある countryName が fileB にない場合は、次のようにします:

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

grep コマンドの出力を Miller (https://github.com/johnkerl/miller) と結合して実行することができます

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

Germany 4 9
USA 1 2 11
UK 5 6

Linux
  1. 「猫」の出力で単語を強調表示する方法は??

  2. 出力の検索を制限し、信号13を回避しますか?

  3. Lsに出力のバイナリからスクリプトを区別させますか?

  1. Grepからの出力を抑制して、終了ステータスのみを返すようにするにはどうすればよいですか?

  2. 出力列から冗長性を削除しますか?

  3. grep から cp に出力をパイプする方法は?

  1. Linux – Freeからの出力のBuffers列?

  2. ターミナルでマルチスレッドGrepを開始する方法は?

  3. ファイルからGrepパターンを読み取る?