按关键字排序列表

时间:2012-04-04 16:57:05

标签: regex list sorting batch-file

我在keywords.txt文件中有一个关键字列表。我有另一个文件list.txt,每行的开头都有关键字。如何将list.txt中的行按照它们在keywords.txt中显示的顺序排序?

keywords.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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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可能会给出错误的结果。)

用注释文件替换原始文件的代码已注释掉。只需删除REM语句即可激活MOVE语句。

与kiswa的回答一样,上面只会输出list.txt中与keywords.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选项可以避免该错误,但如果您的关键字区分大小写,则会导致问题。请参阅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

答案 2 :(得分: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

这将创建一个已排序的文件,然后删除列表文件并重命名已排序的文件。