Search code examples
unixawksedcut

How can I remove specific characters in certain lines in a file?


How do I cut characters from column 5 to 7 of the lines 3 onwards?

I am trying to use sed/cut.

For example, If I have

this is amazing1 this is amazing11
this is amazing2 this is amazing21
this is amazing3 this is amazing31
this is amazing4 this is amazing41
this is amazing5 this is amazing51
this is amazing6 this is amazing61
this is amazing7 this is amazing71

Output should look like:

this is amazing1 this is amazing11
this is amazing2 this is amazing21
this amazing3 this is amazing31
this amazing4 this is amazing41
this amazing5 this is amazing51
this amazing6 this is amazing61
this amazing7 this is amazing71

The characters is are removed from lines 3 and onwards.


Solution

  • I'd just use awk for clarity, portability, etc.:

    $ awk 'NR>2{$0=substr($0,1,4) substr($0,8)} 1' file
    this is amazing1 this is amazing11
    this is amazing2 this is amazing21
    this amazing3 this is amazing31
    this amazing4 this is amazing41
    this amazing5 this is amazing51
    this amazing6 this is amazing61
    this amazing7 this is amazing71
    

    or using variables populated with the values from your question:

    $ awk -v n=3 -v beg=5 -v end=7 'NR>=n{$0=substr($0,1,beg-1) substr($0,end+1)} 1' file
    this is amazing1 this is amazing11
    this is amazing2 this is amazing21
    this amazing3 this is amazing31
    this amazing4 this is amazing41
    this amazing5 this is amazing51
    this amazing6 this is amazing61
    this amazing7 this is amazing71