10

I have a csv file with data presented as follows

87540221|1356438283301|1356438284971|1356438292151697
87540258|1356438283301|1356438284971|1356438292151697
87549647|1356438283301|1356438284971|1356438292151697

I'm trying to save the first column to a new file (without field separator , and then delete the first column from the main csv file along with the first field separator.

Any ideas?

This is what I have tried so far

awk 'BEGIN{FS=OFS="|"}{$1="";sub("|,"")}1'

but it doesn't work

Deano
  • 10,524
  • 14
  • 61
  • 109

5 Answers5

17

This is simple with cut:

$ cut -d'|' -f1 infile
87540221
87540258
87549647

$ cut -d'|' -f2- infile
1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697

Just redirect into the file you want:

$ cut -d'|' -f1 infile > outfile1

$ cut -d'|' -f2- infile > outfile2 && mv outfile2 file 
Chris Seymour
  • 79,902
  • 29
  • 153
  • 193
7

Assuming your original CSV file is named "orig.csv":

awk -F'|' '{print $1 > "newfile"; sub(/^[^|]+\|/,"")}1' orig.csv > tmp && mv tmp orig.csv
Ed Morton
  • 172,331
  • 17
  • 70
  • 167
2

GNU awk

awk '{$1="";$0=$0;$1=$1}1' FPAT='[^|]+' OFS='|'

Output

1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697
Zombo
  • 1
  • 55
  • 342
  • 375
1

Pipe is special regex symbol and sub function expectes you to pass a regex. Correct awk command should be this:

awk 'BEGIN {FS=OFS="|"} {$1=""; sub(/\|/, "")}'1 file

OUTPUT:

1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697
anubhava
  • 713,503
  • 59
  • 514
  • 593
0

With sed :

sed 's/[^|]*|//' file.txt
rook
  • 5,292
  • 4
  • 36
  • 50