2016-12-21 8 views
1

特定の列のデータに基づいて、重複のカラム保持数を作成AWK、2番目と3番目の列の値は、いくつかの列内で繰り返しれる:(行が同一ではないが)以下data.txtをファイルに

cat data.txt > 
Julie Andrews jand 109 
Julie Andrews jand 119 
John Thomas jd  301 
Alex Tremble atrem 415 
Alex Tremble atrem 3415 
Alan Tremble atrem 215 
John Tomas jd  302 
John Tomas jd  3302 
John Tomas jd  3402 
John Tomas jd  33302 
Alex Trebe atrem 416 

各列ごとに、2つの列に基づいて、最大の繰り返し回数を指定する5番目の列を追加する方法2 &その結果、所望の出力として は次のようになります。

cat desired.output.txt > 
Julie Andrews jand 109  2 
Julie Andrews jand 119  2 
John Thomas jd  301  1 
Alex Tremble atrem 415  3 
Alex Tremble atrem 3415 3 
Alan Tremble atrem 215  3 
John Tomas jd  302  4 
John Tomas jd  3302 4 
John Tomas jd  3402 4 
John Tomas jd  33302 4 
Alex Trebe atrem 416  1 

現在、私は(ただし、これは所望の出力ではありません)各レプリカごとに、単純なカウンタを作成し、以下のコマンドを、持っている:

awk -F "\t" '{OFS="\t"}{print $0,++cnt[$2,$3]}' data.txt 
Julie Andrews jand 109  1 
Julie Andrews jand 119  2 
John Thomas jd 301 1 
Alex Tremble atrem 415 1 
Alex Tremble atrem 3415 2 
Alan Tremble atrem 215 3 
John Tomas jd 302 1 
John Tomas jd 3302 2 
John Tomas jd 3402 3 
John Tomas jd 33302 4 
Alex Trebe atrem 416 1 
+0

ファイルに「John Andrews jand 109」が含まれていない可能性がありますか?もしそうなら、それを追加して共通の2番目と3番目の列に異なる1番目の列があるときの出力がどのように見えるかを示します。 –

答えて

4

最も簡単でソートされていないファイルについては、ダブルスキャンは、入力ファイルです

$ awk -v OFS='\t' 'NR==FNR {count[$2,$3]++; next} 
          {print $0, count[$2,$3]}' file{,} 

Julie Andrews jand 109  2 
Julie Andrews jand 119  2 
John Thomas jd  301  1 
Alex Tremble atrem 415  3 
Alex Tremble atrem 3415 3 
Alan Tremble atrem 215  3 
John Tomas jd  302  4 
John Tomas jd  3302 4 
John Tomas jd  3402 4 
John Tomas jd  33302 4 
Alex Trebe atrem 416  1 

ファイルのソートや大きすぎる場合、あなたはすべてのエントリを収集して印刷することができますコンテキストが変更されたときにカウントされます。

ps。file{,}は、同じファイルを2回処理するためのfile fileのbashの短縮形です。

+0

素晴らしいですが、 'file {、}'が何をしているのかをメモに追加したいかもしれません... – dawg

0

あなたの投稿のサンプル入力に示されているように、あなたのデータは並べ替えられているので、一度も試してみてください。私たちはInput_fileを一度だけ読み取ることができました。サンプル入力がそのようにチェックして、その変数が次の行に異なる値を有する場合、それは彼らのカウントと、すべての前の行の値を出力し、他の言葉で変数ここでガードを維持ソートされている場合、私は上記よう

awk '{if(LAST_1 != $1 && LAST_2 != $2 && NR>1){sub(/@@$/,FS COUNT,VAL);gsub("@@",FS COUNT RS,VAL);print VAL;VAL=COUNT="";}} {VAL=VAL?VAL $0"@@":$0"@@";COUNT++;LAST_1=$1;LAST_2=$2}' Input_file 

成功しました。これがあなたに役立つかどうか私に教えてください。

関連する問題