複数のファイルを一括して並べ替え、複数のファイルから重複した行を削除します(可能であれば)。

複数のファイルを一括して並べ替え、複数のファイルから重複した行を削除します(可能であれば)。

複数のテキストファイルを含むフォルダがあります。

apple.txt、book.txt、Tooth.txtなど

次のように、各テキストファイルを処理するために複数のsedコマンドを含むbashスクリプトを作成しました。

    ...
    find /directory/. -type f -exec sed -i 's/one/two/g' {} \;
    ...

このラインはうまくいきます。

これらのタスクを実行するために、同様の方法(単一コマンド)ですべての個々のテキストファイルを処理する方法はありますか?

  1. 最長文字列から最短文字列に行を並べ替えます(各行には空白のない1つの文字列が含まれています)。

  2. 重複した行を削除してください。

答え1

単一のコマンドの要件が何であるかはよくわかりませんが、以下は非常に似ています。

(cd /directory/; find -type f -printf '%P\0' | while IFS= read -r -d '' fn; do
    awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
    mv "$fn.~" "$fn"
done)

最初の行は、可能な限り強力な方法でファイル名を読み取ります。

2行目では、すべての操作が行われます。

  • awkは各行の先頭に文字数(+スペース)を追加します。
  • -n(数値)、-u(固有)、-r(逆方向)プロセスファイルのソート
  • sed 先行文字数の削除
  • その後、一時ファイルにダンプされます。

その後、mv行は一時ファイルを元のファイルに書き込みます(パイプライン中に完了できないため)。

関連情報