2017-10-05 28 views
0

私は特定の方法で同じ内容を持つディレクトリ内のすべてのファイルを表示しようとしています。ファイルが一意の場合は、表示する必要はありません。他のファイルと同一のファイルは、カンマで区切って同じ行に表示する必要があります。UNIXコマンドを使用してテキストを書式設定する方法は?

c176ada8afd5e7c6810816e9dd786c36 2group1 
c176ada8afd5e7c6810816e9dd786c36 2group2 
e5e6648a85171a4af39bbf878926bef3 4group1 
e5e6648a85171a4af39bbf878926bef3 4group2 
e5e6648a85171a4af39bbf878926bef3 4group3 
e5e6648a85171a4af39bbf878926bef3 4group4 
2d43383ddb23f30f955083a429a99452 unique 
3925e798b16f51a6e37b714af0d09ceb unique2 

は次のように表示されるべき例えば

2group1, 2group2 
4group1, 4group2, 4group3, 4group4 

私はmd5sum値を使用してから、ディレクトリ内で一意と見なされたファイルを知っているが、私は書式設定を行う方法がわかりません部。ソリューションにはawkやsedが含まれていると思いますが、わかりません。助言がありますか? (あなたの現在の入力用)

答えて

2

Awkのソリューション:

awk '{ a[$1]=a[$1]? a[$1]", "$2:$2 }END{ for(i in a) if(a[i]~/,/) print a[i] }' file 

  • a[$1]=a[$1]? a[$1]", "$2:$2 - 第一フィールドの値によって示される各ユニークハッシュのために(フィールド$2から)グループ名を蓄積$1。配列aは、ハッシュで連結され、グループの名前(カンマ,で区切られています)が連結されています。

  • if(a[i]~/,/) print a[i]配列項目を反復する - -

  • for(i in a)意味:ハッシュが複数基(カンマ,で区切られた)に関連付けられている場合 - アイテムを印刷


出力:

2group1, 2group2 
4group1, 4group2, 4group3, 4group4 
+1

あなたの担当者と同じくらい高いですが、私はまだ言わなければなりません。説明のない解決策は良い答えではありません。 –

+1

@StephenP、あなたは私の説明があります。しかし、...私はあなたに何かを言わなければならないでしょう:多くの人が答えています - 多くの答えは、膨大な量のアップフォースを得ました - 説明なし。私は答えを説明するのが好きですが、公平性は私にとってより重要です。 P.S.私は私の担当者の得点を高く呼ぶつもりはない、私は高いと思う300k-500k – RomanPerekhrest

0

入力したら、最初の列が同じであるすべての2番目の列を基本的に収集します。だから最初のステップはawkを使って2番目のカラムを最初にハッシュすることです。私はここに掲載ソリューション活用:Concatenate lines by first column by awk or sed

awk '{table[$1]=table[$1] $2 ",";} END {for (key in table) print key " => " table[key];}' file 

c176ada8afd5e7c6810816e9dd786c36 => 2group1,2group2, 
e5e6648a85171a4af39bbf878926bef3 => 4group1,4group2,4group3,4group4, 
3925e798b16f51a6e37b714af0d09ceb => unique2, 
2d43383ddb23f30f955083a429a99452 => unique, 

をそして、あなたは本当にちょうどあなたが(セパレータとして使用するためにAWKを伝える「」)は、少なくとも二つのフィールドを持っていることを確認し、ユニークなものを排除するためにフィルタ処理したい場合は:

awk '{table[$1]=table[$1] $2 ",";} END {for (key in table) print key " => " table[key];}' file | awk -F ',' 'NF > 2' 

c176ada8afd5e7c6810816e9dd786c36 => 2group1,2group2, 
e5e6648a85171a4af39bbf878926bef3 => 4group1,4group2,4group3,4group4, 
0

たPerl:

perl -lane ' 
     push @{$groups{$F[0]}}, $F[1] 
    } END { 
     for $g (keys %groups) { 
      print join ", ", @{$groups{$g}} if @{$groups{$g}} > 1 
     } 
' file 

出力の順序は不定です。

0

これはあなたのために働くかもしれない(GNUのSED):

sed -r 'H;x;s/((\S+)\s+\S+)((\n[^\n]+)*)\n\2\s+(\S+)/\1,\5\3/;x;$!d;x;s/.//;s/^\S+\s*//Mg;s/\n[^,]+$//Mg;s/,/, /g' file 

は、ファイルのすべての行を収集し、行を折りたたむにはパターンマッチングを使用します。ファイルの最後に、キーと一意の行を削除し、残りの部分を印刷します。

関連する問題