我想知道是否可以按列对文本文件进行排序。例如
我有这样aux1.txt
的行
Name SecondName Grade
在外壳中我可以做到这一点
sort -r -k 3 aux1
它按第 3 列(等级)对文件进行排序。
批量
sort /+3 < aux1.txt
在第三个字母之后对文件进行排序。
我阅读了批处理的排序手册,但没有结果。
我想知道是否可以按列对文本文件进行排序。例如
我有这样aux1.txt
的行
Name SecondName Grade
在外壳中我可以做到这一点
sort -r -k 3 aux1
它按第 3 列(等级)对文件进行排序。
批量
sort /+3 < aux1.txt
在第三个字母之后对文件进行排序。
我阅读了批处理的排序手册,但没有结果。
您可以使用批处理文件 编写自己的排序包装器。
您只需要将列重新排序到临时文件中,
对其进行排序并重新排序。(几乎很明显)
REM *** Get the desired colum and place it as first column in the temporary file
setlocal DisableDelayedExpansion
(
for /F "tokens=1-3 delims= " %%A in (aux1.txt) DO (
set "par1=%%A"
set "par2=%%B"
set "par3=%%C"
setlocal EnableDelayedExpansion
echo(!par2! !par1! !par2! !par3!
endlocal
)
) > aux1.txt.tmp
REM ** Now sort the first colum, but echo only the rest of the line
for /F "usebackq tokens=1,* delims= " %%A in (`sort /r aux1.txt.tmp`) DO (
echo(%%B
)
对您来说可能为时已晚,但作为一般建议,您可以比创建临时文件简单得多。只需通过排序管道即可:
for /f "tokens=1-3" %%a in ('(for /f "tokens=1-3" %%x in (aux1.txt^) do @echo %%z %%x %%y^)^|sort') do echo %%b %%c %%a
请注意,它是一个命令,只需在命令提示符下键入即可使用,根本不需要任何批处理文件(当然,必须为此减少 %%)。
虽然我真的很喜欢 Jeb 的回答,但多年来我一直在使用 Chris LaRosa 的 TextDB 工具。
您可以对多个列进行排序,通过他的另一个工具(或任何其他 CL 工具)进行管道传输。有点老...
SortFileBySecondColumn.bat
@echo off
if "%1"=="" (
echo Syntax: %0 FileToSort.txt [/R]
echo /R means Sort in Reverse Order
goto Ende
)
set InputFile=%1
for /f "tokens=1-2* delims= " %%a in ('(for /f "tokens=1-2* delims= " %%n in (%InputFile%^) do @echo %%o %%n %%p^)^|sort %2') do echo %%b %%a %%c
:Ende
用法:SortFileBySecondColumn UnsortedFile.txt > SortedFile.txt
如果您在那时交换delims=
,delims=;
则可以将其用于 CSV 文件。
示例输入文件:
172.20.17.59 PC00000781 # 14.01.2022 12:35:55
172.20.17.22 NB00001021 # 31.01.2022 14:40:38
172.20.16.114 TRANSFER14 # 11.02.2022 11:22:07
10.59.80.27 PC00001034 # 14.02.2022 15:39:23
10.59.80.140 XXBNB00173 # 16.02.2022 10:13:31
172.20.17.23 PC00000XXX # 18.02.2022 12:40:58
10.59.232.25 NB00000178 # 18.02.2022 14:38:53
结果输出文件:
10.59.232.25 NB00000178 # 18.02.2022 14:38:53
172.20.17.22 NB00001021 # 31.01.2022 14:40:38
172.20.17.59 PC00000781 # 14.01.2022 12:35:55
172.20.17.23 PC00000XXX # 18.02.2022 12:40:58
10.59.80.27 PC00001034 # 14.02.2022 15:39:23
172.20.16.114 TRANSFER14 # 11.02.2022 11:22:07
10.59.80.140 XXBNB00173 # 16.02.2022 10:13:31