2

I have a csv file that looks like this:

2017-06-01,3967485,Completed,local,in,0,13492,11746,2017-06-27 14:13:47+00,2017-06-27 14:20:16+00,389,ddb19040,mydomain.net,yourdomain.net,""
2017-07-01,3967488,Completed,local,in,0,13492,11746,2017-07-27 14:13:47+00,2017-06-27 14:20:16+00,389,ddb19040,mydomain.net,yourdomain.net,""

What I need to do is write a bash script that will loop through this file line by line, and grab the first field as one value, and then save the rest of the line without the first field (and comma) as a separate variable.

I have the following code so far:

 for aline in $(cat /tmp/test.csv); do                         
       echo $aline 
 done       

But i'm not sure how to parse each line. Any pointers would be appreciated.

EDIT1

Using the suggested answer produces the following output in new_file

   ,Completed,local,in,0,13492,11746,2017-06-27 14:13:47+00,2017-06-27 14:20:16+00,389,ddb19040,mydomain.net,yourdomain.net,""
   ,Completed,local,in,0,13492,11746,2017-07-27 14:13:47+00,2017-06-27 14:20:16+00,389,ddb19040,mydomain.net,yourdomain.net,""

I'd like it to include field2 ($b in the suggested answer) at the start of each line

Jeff Schaller
  • 67,283
  • 35
  • 116
  • 255
dot
  • 705

4 Answers4

2

How about using awk:

awk 'BEGIN{FS=",";OFS=","}{$1=""; print}' file_name
user1404316
  • 3,078
  • so do this after the echo ? – dot Feb 28 '18 at 22:04
  • @dot - no need for anything except this simple one line. Just replace file_name with your file, eg /tmp/test.csv and you're off to the races. If your input is huge, you'll also notice that this solution is much more computationally efficient than using bash (ie. it will finish faster) – user1404316 Feb 28 '18 at 22:09
  • @dot - did you get it working? – user1404316 Mar 01 '18 at 03:36
1

Try this :

while IFS=, read -r a b; do echo "$b" >> new_file; done < file
cat new_file

http://mywiki.wooledge.org/BashFAQ/001

0
$ IFS=,
$ while  read -r a b ;do onevalue=$a; restvalue=$b; echo $a ;done <CSV_FILE >FirstF
$ cat FirstF
2017-06-01
2017-07-01

put your processing code for the rest value by making use of $b variable inside loop block one val for each one loop

0

You can use sed

sed 's/[^,]*,//' csv.file

If you want to keep the first col in a file

sed -e 'h;s/,.*//w col1.file' -e 'x;s/[^,]*,//' csv.file

Or with gnu sed

sed -e 's/,/\n/;W col1.file' -e 's/[^\n]*\n//' csv.file
ctac_
  • 1,960