1

Windows マシンで数百のファイルをクリーンアップする作業を行っていますが、そのために必要なことの 1 つは、いくつかの重複行を削除することです。したがって、サンプル ファイルは次のようになります。

foo=false    
bar=true
baz=false
baz=false
baz=false

それで、sed私はこのサイトに出くわしました。このサイトでは、重複した行を削除する行を紹介していました.

sed "$!N; /^\(.*\)\n\1$/!P; D" textfile.txt

そこで、コマンド ウィンドウにプラグインして動作するかどうかを確認したところ、コンソール ウィンドウに重複した行が削除されたことが示されました。その後、その行をバッチ スクリプトに挿入して、編集が必要なファイルのリストに対して実行しました。

FOR /F %%a IN ('listfile.txt') DO (
  sed "$!N; /^\(.*\)\n\1$/!P; D" %%a
)

しかし、ファイルのテスト リストに対してこれを実行すると、重複する行の 1 つを除いて、ファイルからすべての行が削除されました。

私はsedその行が何をしているのかを確実に知るには十分に精通していませんが、それをテストしたところ、私が望んでいたことを行っていることがわかりました。それで、何が得られますか?sedバッチ ファイルで動作する方法で何か不足していますか?


私が試したコメントに基づいて:

gawk "!a[$0]++" textfile.txt

また、コマンドラインでは機能しますが、スクリプトでは機能しません。したがって、バッチファイルがこのコマンドを実行する方法には間違いなく問題がありますが、それが何であるかを理解することはできません.

4

2 に答える 2

1

Windows プラットフォームでは、PowerShell を使用すると簡単です。

get-content "textfile.txt" | sort-object -unique

明細書

于 2013-03-27T21:12:22.067 に答える
1

元のステートメントでさらにテストを行った後、コマンドでsedハングアップしていることがわかりました。!そのため、そのルートに沿って掘り下げ始めたところ、ステートメント内であってもそれらの間のすべてが削除されるEnableDelyedExpansion原因となっていることがわかりました。!sed

したがって、私の選択肢は、 をエスケープする!か、 の範囲を狭めることでしたEnableDelayedExpansion。エスケープが機能していないように見えたので、それを必要とする特定の変数の周りに範囲を狭めただけで、その後sedステートメントは正しく機能するように見えました。

于 2013-03-28T15:37:36.623 に答える