Search code examples
awksedreplacedecimaltruncate

Delete decimals of a specific columns with sed


I am working with a csv file and I want to truncate the numbers with decimals of a specific column. Three of the lines are:

123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S

1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.346;;S

1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S

And I want this output:

123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S

1243;rho;9;RpO, chess yext cat;downpio;67;1;0;237753;25.346;;S

1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S

I have tried thies code:

sed  -e '/^.\+pio$/,/^\..\*;[[:digit:]];[[:digit:]];.\*;.\*;.\*;.\*[[:space:]]$/d' data.csv

but doesnt work... Any suggestion, please?


Solution

  • You can use

    sed 's/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*/\1/' data.csv
    

    Details:

    • ^ - start of string
    • \(\([^;]*;\)\{5\}[0-9]*\) - Group 1 (\1):
      • \([^;]*;\)\{5\} - five occurrences of any zero or more chars other than ; and a ;
      • [0-9]* - zero or more digits
    • [^;]* - zero or more chars other than ;.

    See the online demo:

    s='123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S
    1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.346;;S
    1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S'
    sed 's/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*/\1/' <<< "$s"
    

    Output:

    123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S
    1243;rho;9;RpO, chess yext cat;downpio;67;1;0;237753;25.346;;S
    1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S