我在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
答案 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
这将创建一个已排序的文件,然后删除列表文件并重命名已排序的文件。