数十から数百の範囲の多数のテキストファイルを含むいくつかのフォルダがあります。これらのテキストファイルは、数百万行を含む単純なデータベースであり、各行には1つのレコードが含まれています。ただし、それらのレコードはソートされておらず、多くの重複が含まれています。それらをすべて個別に(つまり、互いに独立して)並べ替えて重複排除したいのですが、私の理解でsort
は、すべての入力ファイルの連結出力しか生成できません-つまり、複数のファイルが与えられた場合でも、それはこれらすべてのファイルの結果を組み合わせた1つの出力ファイルを生成します。
現在のフォルダ内のすべてのファイルを並べ替えて、それぞれに個別に並べ替えられた出力ファイルを生成するにはどうすればよいですか?また、出力ファイルを現在のディレクトリ内のサブフォルダに出力したいと思います。for
ループは、私には明白な解決策ですが、私はこれを行うには、いくつかの簡単な方法があります場合には、ここで聞いてるのよsort
、私が渡って来るか見逃していませんでしたということが。私のbash
知識も非常に不足しているので、for
ループが最も簡単な解決策である場合、私がやりたいことにはまだ及ばない何かを一緒にハッキングするのに何日も費やすのではなく、誰かがそれを実行するための最良の方法を提供してくれるとありがたいです。
はい、でこれを行うことができますfor
。「これを行うためのより簡単な方法」があるとしてもsort
(しかし私はそうは思いません)、これも非常に簡単です。
# cd to the directory you want to process
mkdir sorted
for file in *;
do
printf 'Processing %s\n' "$file"
[ -f "$file" ] && sort -u "$file" > "./sorted/$file"
done
ノート:
for file in *
サブディレクトリ内のファイルは処理しません。printf
進捗状況を報告するだけです。実際、それは後に配置する必要があります[ ... ]
(以下を参照)が、コードを過度に複雑にしたくありません。printf
全体を無音にしたい場合は、行を削除するだけです。[ -f "$file" ]
$file
が通常のファイルであるかどうかを確認します。最も一般的なパターン(つまり*
)では、少なくともディレクトリを引数として実行sort
しないようにするために、この条件が必要ですsorted
(これにより、エラーがスローされ、無害ですがエレガントではありません)。のように、*.txt
または*.db
その代わりに、より具体的なグロブを使用する場合*
(たとえば、desktop.ini
処理されるべきではない漂遊ファイルをスキップする場合)、このテストは必要ない可能性があります。この場合[ ... ] &&
、行を省略して開始することができますsort
(ただし、行をそのままにしておいても問題はありません)。sort
さまざまなオプションをサポートしており、並べ替えの方法に応じて、それらのいくつかを使用することをお勧めします。
sort -u
エントリを並べ替えた直後に重複排除します。すでに使用してsort
いる場合は、uniq
コマンドを使用するよりも冗長性が低くなります。
単純なグロブよりも複雑な条件に従ってファイルを選択する必要がある場合は、find
最初から始める方がよい場合があります。あなたの現在の仕事のfor
ために大丈夫なはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加