2012-04-04 9 views
0

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

keywords.txt

house 
car 
tree 
woods 
mailbox 

car bbdfbdfbdfbdf 
tree gdfgvsgsgs 
mailbox gsgsdfsdf 
woods gsgsdgsdgsdgsdgsddsd 
house gsdgfsdgsdgsdgsdg 

list.txtに最終結果list.txtに

house gsdgfsdgsdgsdgsdg  
car bbdfbdfbdfbdf 
tree gdfgvsgsgs 
woods gsgsdgsdgsdgsdgsddsd 
mailbox gsgsdfsdf 
+0

ここではWindowsバッチファイルスクリプティングについて話していますか?または、どのスクリプト言語が大丈夫(Python、Perl、Rubyなど)ですか? – kiswa

+0

私はこれについてどうやって行くのか知りません。可能であれば、Windowsのバッチ処理は問題ありません。 – Blainer

答えて

1

キスワの答えが改善され、簡略化されたバージョンです。

@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が間違った結果をもたらす可能性があります。

元のファイルをソート済みのファイルに置き換えるコードはコメントアウトされています。単にMOEM文を有効にするには、REM文を削除します。

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

list.txtにキーワードと一致しない行がある可能性があります。あなたがソートされた出力の下部にこれらの行を保持したい場合は、使用:/I(大文字小文字を区別しない)オプションが異なるため、複数のリテラル検索文字列を扱うFINDSTRのバグを使用しなければならないこと

@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オプションを指定するとバグは回避されますが、キーワードで大文字と小文字が区別される場合は問題が発生します。 What are the undocumented features and limitations of the Windows FINDSTR command?を参照してください。

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 
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 
+0

これはWindowsのバッチですか? – Blainer

+0

これは 'bash'コマンド – kev

+0

okです。私はこれをテストします – Blainer

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 

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

+0

これは、最終的なソートファイルのいくつかの行を削除します。私は46行から始まり、38で終わります。必要に応じて、私はあなたのリストとキーワードファイルを送ることができます。 – Blainer

+0

これは、すべての行が並べ替えのキーワードと一致する場合にのみ機能します。ソートされていない項目をリストに残しておきたい場合は、それは最初に尋ねたものとは別のものです。また、空行は削除されます。 – kiswa

+0

すべての行がキーワードと一致しています。空の行とそれに類する行は問題にならないはずです...私は46行、46のキーワードを持っています。ここに私のファイルは、Windowsで 'findstr'コマンドが' list.txt'ファイルに次の行を見つけられないだろういくつかの理由について – Blainer

関連する問題