9

I'm using Windows, and I would like to extract certain columns from a text file using a Perl, Python, batch etc. one-liner.

On Unix I could do this:

cut -d " " -f 1-3 <my file>

How can I do this on Windows?

toolic
  • 52,335
  • 14
  • 70
  • 111
atricapilla
  • 2,480
  • 11
  • 36
  • 38

5 Answers5

12

Here is a Perl one-liner to print the first 3 whitespace-delimited columns of a file. This can be run on Windows (or Unix). Refer to perlrun.

perl -ane "print qq(@F[0..2]\n)" file.txt
toolic
  • 52,335
  • 14
  • 70
  • 111
3

you can download GNU windows and use your normal cut/awk etc.. Or natively, you can use vbscript

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfLine
    strLine=objFile.ReadLine
    sp = Split(strLine," ")
    s=""
    For i=0 To 2
        s=s&" "&sp(i)       
    Next
    WScript.Echo s
Loop

save the above as mysplit.vbs and on command line

c:\test> cscript //nologo mysplit.vbs file

Or just simple batch

@echo off
for /f "tokens=1,2,3 delims= " %%a in (file) do (echo %%a %%b %%c)

If you want a Python one liner

c:\test> type file|python -c "import sys; print [' '.join(i.split()[:3]) for i in sys.stdin.readlines()]"
ghostdog74
  • 307,646
  • 55
  • 250
  • 337
2

That's rather simple Python script:

for line in open("my file"):
    parts = line.split(" ")
    print " ".join(parts[0:3])
Łukasz
  • 33,061
  • 4
  • 31
  • 32
1

The easiest way to do it would be to install Cygwin and use the Unix cut command.

Steven Huwig
  • 19,069
  • 9
  • 54
  • 79
0

If you are dealing with a text file that has very long lines and you are only interested in the first 3 columns, then splitting a fixed number of times yourself will be a lot faster than using the -a option:

perl -ne "@F = split /\s/, $_, 4; print qq(@F[0..2]\n)" file.txt

rather than

perl -ane "print qq(@F[0..2]\n)" file.txt

This is because the -a option will split on every whitespace in a line, which potentially can lead to a lot of extra splitting.

winni2k
  • 1,352
  • 14
  • 18