Is there an equivalent to 'cut -c' in Windows cmd.exe?
cmd, windows
Solution
If you working with modern windows, you are not restricted to cmd.exe commands natively, you can use vbscript. If your policy is not to use vbscript either, then I guess you should sack your management :)
Set objFS=CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file"
Set objFile = objFS.OpenTextFile(strFile)
strFirstLine = objFile.ReadLine
Do Until objFile.AtEndOfStream
strLine= objFile.ReadLine
var1 = Mid(strLine,10) ' do substring from position 10 onwards
' var2 = Mid (strLine,<pos>,<length>) ' get next offset and save to var2
WScript.Echo var1 & var2 ' print them out.
Loop
Basically, to "cut" characters of a string, you use Mid() function. please look at the vbscript documentation to find out more.
Save the above as test.vbs and, on the command line, do
c:\test> cscript /nologo test.vbs > newfile
Of course, "substring" can also be done with pure cmd.exe but I will leave it to some others to guide you.
Update by Pax: Based on this answer, I came up with the following which will be a good start:
option explicit
dim objFs, objFile, strLine, value1, value2
if wscript.arguments.count < 1 then
wscript.echo "Usage: process <input-file>"
wscript.quit
end if
set objFs=createObject("Scripting.FileSystemObject")
set objFile = objFs.openTextFile(wscript.arguments.item(0))
do until objFile.atEndOfStream
strLine= objFile.readLine
value1 = trim(mid(strLine, 8, 10))
value2 = trim(mid(strLine, 23, 4))
if right(value1,1) = "-" then value1 = "-" & left(value1,len(value1)-1)
if right(value1,1) = "+" then value1 = left(value1,len(value1)-1)
if left(value1,1) = "+" then value1 = mid(value1,2)
wscript.echo value1 & "," & value2
loop
This matches all the requirements we had. We can make the offsets and lengths into command-line arguments later.
End update.
Problem
I have some files of fixed line size, fixed field size that I need to extract information from. Nornmally, I'd use Cygwin (`cut` et al), but that's not an option in this case due to (boneheaded) management policies I can't change. It has to be done using standard XP toolset included with Windows. I need to extract the 10 characters at offset 7 and 4 characters at offset 22 (zero-based), and output them to a file but with a slight twist: - The first field may have a negative, positive, or no sign (at the start or end). The sign should be moved to the front, or removed totally if it's positive. - The second field should have leading and trailing spaces removed. For example: ``` 1 2 3 <- ignore (these lines not in file,) 0123456789012345678901234567890123456789 <- ignore ( here only for info.) xxxxxxx 15.22-yyyyyABCDzzzzzzzzzzz... xxxxxxx 122.00+yyyyy XX zzzzzzzzzzz... xxxxxxx 9yyyyyYYY zzzzzzzzzzz... ``` should produce (`<` indicates end of line): ``` -15.22,ABCD< 122.00,XX< 9,YYY< ```