2012-05-07 14 views
2

を複製しますAWKの印刷にのみ、私はファイルを持っている

私は動作する例を見つけました。

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

私は同じことをしたいが、getlineを使用したい。

+0

もう1つ: 'sort file |ユニーク-D' – kev

+0

なぜgetlineを使いたいのですか? – Kevin

+0

@ケビン私はスクリプトでそれが必要になるので。 – Tedee12345

答えて

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

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

+0

よい解決策。 ありがとうございます。 – Tedee12345

+0

@ Tedee12345:注文にわずかに影響する可能性があることに注意してください。 –

+0

@ Dennis Williamsonこのテーマの例を挙げることはできますか? – Tedee12345

0

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

awk '{a[$1]++}END{for(x in a)if(a[x]>1)for(i=1;i<=a[x];i++)print x}' file 
+0

彼は順番に行を望むように見えます。 – Kevin

+0

私の編集内容をお読みください。 ご協力いただきありがとうございます – Tedee12345

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 
+0

私の編集をお読みください。 あなたの助けをありがとう – Tedee12345