2

私はファイルを持っています:

jeden
dwa
jeden
trzy
trzy
cztery
piec
jeden

このコマンドは次を出力します。

$ awk 'BEGIN {while ((getline < "file") > 0) if(a[$0]++) print }'
jeden
trzy
jeden

すべての複製を印刷したい:

jeden
jeden
trzy
trzy
jeden

編集:

うまくいく例を見つけました。

awk '{if (x[$1]) { x_count[$1]++; print $0; if (x_count[$1] == 1) { print x[$1] } } x[$1] = $0}' file

同じことをしたいのですが、getline を使用します。

4

3 に答える 3

3
awk 'BEGIN {while ((getline < "file") > 0) { a[$0]++; if(a[$0] == 2) print; if (a[$0] >= 2) print }}'

カウントが2の場合、行を印刷します。カウントが2以上の場合、行を印刷します。したがって、2回目の出現では、「追いつく」ために行が2回印刷されます。

于 2012-05-08T00:00:21.423 に答える
1

すべての行をメモリに保存するか、ファイルを 2 回通過させる必要があります。おそらく最初の方が簡単で、大規模なファイルでない限り、おそらくそのためのメモリがあります。もちろん、これを 1 行に詰め込むこともできますが、ここでは理解しやすいようにファイルとして示しています。

#!/usr/bin/awk -f

{ 
        lines[NR] = $0
        counts[$0]++ 
}             

END { 
        for(i = 0; i < length(lines); i++) {
                if(counts[lines[i]] > 1) {
                        print lines[i]
                }       
        }       
}

また、オリジナルは次のようにより簡潔に記述されます。

$ awk 'a[$0]++' file
于 2012-05-07T16:27:37.157 に答える
0

これはあなたのために働くかもしれません:

awk '{a[$1]++}END{for(x in a)if(a[x]>1)for(i=1;i<=a[x];i++)print x}' file
于 2012-05-07T16:27:17.987 に答える