Sorting 如何使用Windows命令行在多个位置对文件进行排序?

Sorting 如何使用Windows命令行在多个位置对文件进行排序?,sorting,batch-file,Sorting,Batch File,我有一个索引文本文件,我排序有困难。我一直在网上寻找答案,但谷歌没有通过多位置搜索找到任何答案 在Unix上尝试这样做(这很容易),可以按如下方式进行 sort inputfile -k1.1 -k3.3 -o outputfile 应该可以完成任务,但是尝试这样做会给我带来Cygwin错误,因为已经指定了两次输入(UNIX排序失败了!) 我需要使用Windows控制台应用程序或Perl对这个索引文件进行排序 以下是输入数据: 1925699|0003352_0050003895.pdf005

我有一个索引文本文件,我排序有困难。我一直在网上寻找答案,但谷歌没有通过多位置搜索找到任何答案

在Unix上尝试这样做(这很容易),可以按如下方式进行

sort inputfile -k1.1 -k3.3 -o outputfile
应该可以完成任务,但是尝试这样做会给我带来Cygwin错误,因为已经指定了两次输入(UNIX排序失败了!)

我需要使用Windows控制台应用程序或Perl对这个索引文件进行排序

以下是输入数据:

1925699|0003352_0050003895.pdf005000038951243352 16826280003352\u 0050003894.pdf005000038940003352
16826280003352\u 0050003893.pdf005000038930003352

所需输出为:

16826280003352\u 0050003893.pdf005000038930003352
16826280003352\u 0050003894.pdf005000038940003352
1925699|0003352_0050003895.pdf005000038951243352

我目前正在尝试使用:

sort/+1,7 /+32,11 < inputfile > outputfile
sort/+1,7/+32,11outputfile
但我没能成功。(它只对第一个参数进行排序。)同样,Unix是不可能的,我可以用Perl来完成,但这可以在Windows命令行中完成吗?

@ECHO Off
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
设置“filename1=%sourcedir%\q45575219.txt”
设置“outfile=%destdir%\outfile.txt”
设置“tempfile=%destdir%\tempfile.txt”
(
对于/f“usebackqdelims=“%%a IN”(“%filename1%”)DO(
对于/f“tokens=1,3delims=|”%%s IN(“%%a”)DO(
回声(%%s%%t^ |%%a
)
)
)>%tempfile%
(
对于('sort”%tempfile%”中的/f“tokens=1*delims=|“%%a,请执行回显(%%b
)>“%outfile%”
删除“%tempfile%”
后藤:EOF
您需要更改
sourcedir
destdir
的设置以适应您的环境

我使用了一个名为
q45575219.txt
的文件,其中包含了用于测试的数据

生成定义为%outfile%的文件

使用定义为%tempfile%的临时文件

读取源文件,将每一行分配给
%%a
。使用管道作为分隔符分析
%%a
,并选择第一个和第三个标记。将第一个和第三个标记作为整个行的前缀,用管道分隔,并将
echo
放入临时文件中

对临时文件进行排序,在管道上再次标记,选择第一个标记(在第一个管道之前)和行的其余部分;仅将其余部分输出到目标文件。

@ECHO Off
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
设置“filename1=%sourcedir%\q45575219.txt”
设置“outfile=%destdir%\outfile.txt”
设置“tempfile=%destdir%\tempfile.txt”
(
对于/f“usebackqdelims=“%%a IN”(“%filename1%”)DO(
对于/f“tokens=1,3delims=|”%%s IN(“%%a”)DO(
回声(%%s%%t^ |%%a
)
)
)>%tempfile%
(
对于('sort”%tempfile%”中的/f“tokens=1*delims=|“%%a,请执行回显(%%b
)>“%outfile%”
删除“%tempfile%”
后藤:EOF
您需要更改
sourcedir
destdir
的设置以适应您的环境

我使用了一个名为
q45575219.txt
的文件,其中包含了用于测试的数据

生成定义为%outfile%的文件

使用定义为%tempfile%的临时文件

读取源文件,将每一行分配给
%%a
。使用管道作为分隔符分析
%%a
,并选择第一个和第三个标记。将第一个和第三个标记作为整个行的前缀,用管道分隔,并将
echo
放入临时文件中


对临时文件排序,在管道上再次标记,选择第一个标记(在第一个管道之前)和行的其余部分;仅将其余部分输出到目标文件。

您使用的是什么版本的DOS?我使用的是windows 7,因此您没有使用任何版本的
DOS
,尽管在问题标题和正文中都使用了
DOS
。如果您再次搜索谷歌,这一次没有搜索
DOS
6.1.7601版,可能会有所帮助windows的。我想实际的批处理文件使用的是dos排序?你使用的是什么版本的dos?我使用的是windows 7,所以你没有使用任何版本的
dos
,尽管在你的问题标题和正文中都使用了
dos
。如果你再次搜索谷歌,这可能会有所帮助,这次没有搜索的
dos
6.1.7601版windows。实际的批处理文件使用dos排序,虽然我认为?这有点整洁-我运行了它,但我需要的输出太差了。这是我的错-我应该早点把它放在问题中…有没有可能解决当前的问题?:d您提供的输入数据生成与我显示的代码描述的输出。什么问题的症状是什么?源文件的格式是什么?它是否只包含CRLF作为LF的行尾?所有内容都使用CLRLF。我生成的输出有一个字段是已排序字段之间的串联,但其中的行是大量的。我编辑了所有内容,现在只返回2个字段…而且,因为我编辑了错误的你的代码运行得很好。谢谢你~~~这有点整洁——我运行了它,但我需要的输出太差了。这是我的错——我应该早点把它放在问题中……你有没有可能按原样解决当前的问题?:d你提供的输入数据生成了我展示的代码所描述的输出。您的问题的症状是什么?源文件的格式是什么?它是否只包含CRLF作为LF的行尾?所有内容都使用CLRLF。我生成的输出有一个字段是排序字段之间的串联,但行是大量的。我编辑了所有内容,现在只返回2个字段…并且,由于我编辑了wrong发现了一些问题,但我发现你的代码运行良好