リストの比較的単純なインデックスプールを実行するために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