Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing the first column of a csv file to a new file

Tags:

bash

csv

sed

awk

cut

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.

like image 852
S1syphus Avatar asked Apr 16 '10 11:04

S1syphus


People also ask

What is parsing a CSV file?

Comma Separated Values (CSV) is used as a common format to exchange tabular data between spreadsheets and relational databases. In a JavaScript action, you can parse CSV data using the csv library.

How do I AWK my first column?

awk to print the first column. The first column of any file can be printed by using $1 variable in awk. But if the value of the first column contains multiple words then only the first word of the first column prints. By using a specific delimiter, the first column can be printed properly.


2 Answers

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.

like image 123
Thomas Avatar answered Oct 04 '22 10:10

Thomas


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

like image 34
Personman Avatar answered Oct 04 '22 11:10

Personman