同時に複数のテキストから特定の行を取得する方法は?

同時に複数のテキストから特定の行を取得する方法は?

同じディレクトリにtext1.txt、text2.txt、...、text100.txtという100のテキストがあるとします。各テキストから特定の行(最初の100行)を抽出し、この行を別の新しい100行のテキストに別々に保存したいと思います。各新しいテキストには10​​0行があります。

わかりましたhead -100 text1.txt > text1_new.txthead -100 text2.txt > text2_new.txtできます。しかし、端末から両方を抽出するより効率的な方法はありますか?

ありがとうございます! !

答え1

一つの方法は

find . -name "text*.txt" -type f -print0 | xargs -0 -I{} sh -c 'f="{}"; head -100 "$f" > "${f%.txt}_new.txt"'
  • find . -name "text*.txt" -type fディレクトリ内のすべてのテキストファイルを探す
  • -print0スペースを保存するために、ヌル文字でファイルパスを印刷します。
  • xargs -0NULLで終わるパラメータを受け入れます。
  • -I{}パラメータとして使用するプレースホルダ
  • sh -cコマンド文字列を使用してダッシュを実行する
  • f="{}"パラメータを変数に保存f
  • head -100 "$f"ヘッダーコマンド
  • "${f%.txt}_new.txt"パラメータの「.txt」を「_new.txt」に置き換えます。

答え2

ファイルを繰り返すことができます。

for f in *.txt
do
    head -n100 "$f" > "${f%.txt}_new.txt"
done

一致するすべてのファイルを一覧表示するために到着時に展開*.txtされます。このスクリプトを(部分的または完全に)実行した場合、一部の結果ファイルも一致します。解決策は、実行する前に削除するrm *_new.txtか()パターンを締めることです。

答え3

「並列性」が必要な場合は、次を使用します。parallel

shopt -s extglob
parallel sh -c 'out="${1%.txt}_new.txt"; head -n 100 "$1" > "$out"' _ -- !(*_new).txt

私はあなたのシェルがbashであると仮定して使用します。拡張モードテキストファイルを繰り返しいいえ*_new.txt

関連情報