0

keywords.txtファイルにキーワードのリストがあります。各行の先頭にキーワードを含む別のファイルlist.txtがあります。list.txtの行をkeywords.txtに表示されるのと同じ順序に並べ替えるにはどうすればよいですか?

キーワード.txt

house
car
tree
woods
mailbox

list.txt

car bbdfbdfbdfbdf
tree gdfgvsgsgs
mailbox gsgsdfsdf
woods gsgsdgsdgsdgsdgsddsd
house gsdgfsdgsdgsdgsdg

list.txtの最終結果

house gsdgfsdgsdgsdgsdg    
car bbdfbdfbdfbdf
tree gdfgvsgsgs
woods gsgsdgsdgsdgsdgsddsd
mailbox gsgsdfsdf
4

3 に答える 3

1

これは、kiswaの回答の改善および簡略化されたバージョンです。

@echo off
(
  for /f "usebackq" %%A in ("keywords.txt") do findstr /bl "%%A" list.txt
)>sorted.txt
REM move /y sorted.txt list.txt

FINDSTR コマンドは、キーワードで始まる行のみに一致し、検索をリテラル検索に強制します。/L(オプションが指定されておらず、キーワードにたまたま正規表現のメタ文字が含まれている場合、FINDSTR は間違った結果を返す可能性があります。)

元のファイルをソート済みファイルに置き換えるコードはコメントアウトされています。MOVE ステートメントをアクティブにするには、REM ステートメントを削除するだけです。

kiswa の回答と同様に、上記は、keywords.txt のキーワードに一致する list.txt の行のみを出力します。

キーワードに一致しない行が list.txt に含まれている可能性があります。ソートされた出力の下部にあるこれらの行を保持する場合は、次を使用します。

@echo off
(
  for /f "usebackq" %%A in ("keywords.txt") do findstr /bli "%%A" "list.txt"
  findstr /vblig:"keywords.txt" "list.txt"
)>sorted.txt
::move /y sorted.txt list.txt

/I長さの異なる複数のリテラル検索文字列を処理する FINDSTR のバグのため、(大文字と小文字を区別しない) オプションを使用する必要があることに注意してください。この/Iオプションはバグを回避しますが、キーワードで大文字と小文字が区別されると問題が発生します。Windows FINDSTR コマンドの文書化されていない機能と制限事項は何ですか? を参照してください。.

list.txt にないキーワードがある可能性があります。これらのキーワードを後に続くデータなしで含める場合は、次を使用します。

@echo off
(
  for /f "usebackq" %%A in ("keywords.txt") do findstr /bl "%%A" "list.txt" || echo %%A
)>sorted.txt
::move /y sorted.txt list.txt

明らかに、両方の手法を組み合わせて、両方のファイルの結合を確実に保持することができます。

@echo off
(
  for /f "usebackq" %%A in ("keywords.txt") do findstr /bli "%%A" "list.txt" || echo %%A
  findstr /vblig:"keywords.txt" "list.txt"
)>sorted.txt
::move /y sorted.txt list.txt

上記はすべて、キーワードにスペースやタブ文字が含まれていないことを前提としています。その場合、FOR /F オプションと FINDSTR オプションを変更する必要があります。

@echo off
(
  for /f "usebackq delims=" %%A in ("keywords.txt") do findstr /bic:"%%A" "list.txt" || echo %%A
  findstr /vblig:"keywords.txt" "list.txt"
)>sorted.txt
::move /y sorted.txt list.txt
于 2012-04-04T18:59:09.513 に答える
1
$ join -1 2 -2 1 <(cat -n keywords.txt | sort -k2) <(sort list.txt) | sort -k2n | cut -d ' ' -f 1,3-
house gsdgfsdgsdgsdgsdg
car bbdfbdfbdfbdf
tree gdfgvsgsgs
woods gsgsdgsdgsdgsdgsddsd
mailbox gsgsdfsdf
于 2012-04-04T17:07:52.690 に答える
0

これは Windows バッチ ファイルです。おそらく最も効率的ではありませんが、読みやすいと思います。

@echo off

for /F "tokens=*" %%A in (keywords.txt) do (
    for /F "tokens=*" %%B in ('findstr /i /C:"%%A" list.txt') do (
        echo %%B >> sorted.txt
    )
)

del list.txt

rename sorted.txt list.txt

これにより、ソートされたファイルが作成され、リスト ファイルが削除され、ソートされたファイルの名前が変更されます。

于 2012-04-04T17:47:22.217 に答える