50

Operating System: OSX Method: From the command line, so using sed, cut, gawk, although preferably no installing modules.

Essentially I am trying to take the first column of a csv file and parse it to a new file.

Example input file

EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6

Desire output

EXAMPLEfoo 
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

So I want the first column.

Here is what I have tried so far:

awk -F"," '{print $1}' in.csv > out.txt

awk -F"," '{for (i=2;i<=NF;i++)}' in.csv > out.txt

awk -F"," 'BEGIN { OFS="," }' '{print $1}' in.csv > out.txt

cat in.csv | cut -d \, -f 1 > out.txt

None seem to work, either they just print the first line or nothing at all, so I would assume it's failing to read line by line.

S1syphus
  • 1,401
  • 5
  • 20
  • 29
  • As I've pointed out in answer to your previous(and very similar) question, my FOSS project http://code.google.com/p/csvfix/ does exactly this, is easier to use for parsing CSV than awk et al, and works on OSX. –  Apr 16 '10 at 11:35

4 Answers4

59

Your last option works perfectly for me:

$ cat > in.csv  # Then pasted the example input followed by Ctrl+D:
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
[Ctrl+D]
$ cat in.csv | cut -d, -f1
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

Maybe line endings are biting you here? If the file has DOS-style or even old-Mac-style line endings, this might cause strange behaviour. Try running file in.csv and see what it comes up with.

$ file in.unix.csv
in.unix.csv: ASCII text
$ file in.dos.csv
in.dos.csv: ASCII text, with CRLF line terminators

If the latter is your situation, use the dos2unix tool to convert the file.

Edit: On OS X, it seems flip is what you want.

Thomas
  • 174,939
  • 50
  • 355
  • 478
17

I copy-pasted your sample input, saved it as in.csv, and then ran your first line,

awk -F"," '{print $1}' in.csv > out.txt

and it worked perfectly, like so:

$ emacs in.csv
$ cat in.csv 
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
$ awk -F"," '{print $1}' in.csv > out.txt
$ cat out.txt 
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3

This is in Terminal.app on OS X 10.5

Personman
  • 2,324
  • 1
  • 16
  • 27
13

For me, cut produces expected result:

cut -d, -f1 < in.csv > out.txt
Michal Čihař
  • 9,799
  • 6
  • 49
  • 87
1

If Perl is an option:

perl -F, -lane 'print $F[0]' in.csv > out.txt

These command-line options are used:

  • -n loop around every line of the input file
  • -l removes newlines before processing, and adds them back in afterwards
  • -a autosplit mode – split input lines into the @F array. Defaults to splitting on whitespace.
  • -e execute the perl code
  • -F autosplit modifier, in this case splits on ,

@F is the array of words in each line, indexed starting with $F[0]

Chris Koknat
  • 3,305
  • 2
  • 29
  • 30