grepまたはawkを使用して、インデックスファイルの重複エントリに対応する重複出力行を報告できますか?

grepまたはawkを使用して、インデックスファイルの重複エントリに対応する重複出力行を報告できますか?

リストの比較的単純なインデックスプールを実行するためにgrepまたはawkを使用できないようです。私はこれが問題を引き起こしているとは思わないインデックスファイルに隣接する重複があるので、これだと思います。奇妙なことに、オンラインで解決策を見つけることは成功しませんでした。私が見つけたすべてのクエリは、重複したアイテムを維持するのではなく、削除したい人からのものです。

インデックスファイルは次のとおりです。約40,000個のアイテムがあり、そのうちの多くは重複して並んでいます。

n0000003
n0000003
n0000008
n0000008
n0000017
n0000017
n0000017
n0000017
.....etc

検索ファイルは次のとおりです。各識別子には約10,000個の固有のエントリがあります。

n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
...etc

私に必要なのは、インデックスファイルの重複インデックスエントリ数と同じ重複出力エントリを持つ次の出力です。

n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
...etc

ただし、grepとawkはどちらも1つのアイテムのみを提供します(ファイルを検索するのと同じにします)。私はgrepが繰り返される重複を何の問題もなく処理できると思いますが、その問題を解決する方法を見つけることができません。

以下は、私が動作すると予想するコマンドです。たとえば、次のようになります。

grep -f index.txt searchfile.txt > output.txt
awk -F'\t' 'NR==FNR{c[$1]++;next};c[$1]' index.txt searchfile.txt > output.txt

正確な繰り返し回数を出力するためにgrepまたはawkを取得する方法についての提案があれば良いでしょう!とても感謝しています!アンドリュー

答え1

私の考えでは、あなたが使用できgrepないようです。しかし、あなたはそれを行うために使用することができますawk。私が考えることができる最も簡単な方法は、その内容をメモリに保存し、インデックスを見るたびにそのsearchfile.txt行を印刷することです。

$ awk -F'\t' 'NR==FNR{c[$1]=$0;next}{if(c[$1]){print c[$1]}}' searchfile.txt index.txt 
n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084

両方のファイルがインデックスにソートされている場合は、次のものを使用することもできますjoin

$ join -t$'\t' searchfile.txt index.txt 
n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084

答え2

あなたの試みを見ると、ゴールポストにほぼ近づいていますが、サッカーボールがゴールを通過することを許可せず、単に試みにwhileループを追加するようです。

awk -F'\t' '
  FNR == NR { c[$1]++; next }
  k = c[$1] { while (k--) print }
' index.txt search.txt

関連情報