King of NES
King of NES

Reputation: 271

How to sort a file on multiple positions using Windows command line?

I have an index text file, and I'm having trouble sorting it. I've been looking online for an answer, but Google hasn't pulled up anything with multi-positional searches.

Trying to do so with Unix (which would be easy), would be done as

sort inputfile -k1.1 -k3.3 -o outputfile

should accomplish the task, but trying to do so gives me Cygwin errors of already specifying the input twice (UNIX sorts are out!).

I need to sort this index file, either with Windows console applications or Perl on both positions.

Here is the input data:

1925699|0003352_0050003895.pdf|00500003895|0003352 1682628|0003352_0050003894.pdf|00500003894|0003352
1682628|0003352_0050003893.pdf|00500003893|0003352

The desired output is:

1682628|0003352_0050003893.pdf|00500003893|0003352
1682628|0003352_0050003894.pdf|00500003894|0003352
1925699|0003352_0050003895.pdf|00500003895|0003352

I'm currently trying to use:

sort/+1,7 /+32,11 < inputfile > outputfile

But I've failed to get this to be successful. (It only sorts the first parameter.) Again Unix is out of the question, and I can do it in Perl, but can this be done in Windows command line?

Upvotes: 0

Views: 1920

Answers (1)

Magoo
Magoo

Reputation: 79983

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q45575219.txt"
SET "outfile=%destdir%\outfile.txt"
SET "tempfile=%destdir%\tempfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 FOR /f "tokens=1,3delims=|" %%s IN ("%%a") DO (
  ECHO(%%s%%t^|%%a
 )
)
)>"%tempfile%"
(
FOR /f "tokens=1*delims=|" %%a IN (' sort "%tempfile%" ' ) DO ECHO(%%b
)>"%outfile%"

DEL "%tempfile%"

GOTO :EOF

You would need to change the settings of sourcedir and destdir to suit your circumstances.

I used a file named q45575219.txt containing your data for my testing.

Produces the file defined as %outfile%

Uses a temporary file defined as %tempfile%

Read the source file, assigning each line to %%a. Analyse %%a using pipe as a delimiter and select the first and third tokens. Prefix the first and third tokens to the entire line, separated by a pipe and echo into a temporary file.

sort the temporary file, tokenise again on pipe, selecting the first token (before the first pipe) and the rest of the line; output only the rest to the destination file.

Upvotes: 2

Related Questions