2017-10-05 64 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被索引爲散列帶連接的名稱作爲值(用逗號分隔,)。

  • for(i in a) - 通過數組項迭代

  • if(a[i]~/,/) print a[i] - 是指:如果散列與多於一個(由逗號,分隔)相關 - 打印的項目


輸出:

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

就像你的代表一樣高,我仍然不得不說:沒有解釋的解決方案不是一個好的答案。 –

+1

@StephenP,你有我的解釋。但是......我必須要說一些東西:關於SO的答案有很多,但卻得到了大量的upvotes - 沒有解釋。我也喜歡解釋的答案,但公平對我來說更重要。附:我不會稱我的代表得分高,我認爲很高約爲300k-500k – RomanPerekhrest

0

鑑於您提供的輸入,您基本上希望收集第一列相同的所有第二列。所以第一步就是使用awk來第一列對第二列進行散列。我利用該解決方案張貼在這裏: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 

收集了該文件的所有行和使用模式匹配以摺疊線。在文件末尾,刪除鍵和任何獨特的行,然後打印剩下的部分。