Delete a column from a delimited file in linux

前端 未结 7 1019
星月不相逢
星月不相逢 2020-12-19 02:43

I have a file in the following format:

col1|col2|col3|col4
a|b|c|d
e|f||h
i|j|k|l

I would like to delete col3 (with the delimiter \"|\") fr

相关标签:
7条回答
  • 2020-12-19 03:07

    You could simply use cut.

    cut -d'|' -f1-2,4- file
    
    0 讨论(0)
  • 2020-12-19 03:07

    This might work for you (GNU sed):

    sed 's/[^|]*|//3' file
    
    0 讨论(0)
  • 2020-12-19 03:09
    awk  'BEGIN{FS=OFS="|"}{print $1,$2,$4}'   file
    

    should give you the output.

    it is the very basic awk usage.

    edit

    you didn't mention 70 columns... :(

    try this:

    awk  -F'|' '{s="";for(i=1;i<=NF;i++){f=(NF==i)?"":FS;if(i!=3)s=s $i f;}print s}' file
    
    0 讨论(0)
  • 2020-12-19 03:12

    Here's a possible sed solution:

    sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;'
    

    This will work great for your example, and could be adjusted for other examples, but isn't really a general purpose solution.

    Explanation:

    -i.bak Edit the file in place, first making a backup called filename.bak.

    \(^.*|.*|\) From the start of the line, match everything up to and including the second delimiter. The parenthesis group this match (group 1).

    .*| Match everything up to and including the last delimiter.

    \(.*\) Match the rest and group (group 2).

    \1\2 Replace all of the previous matches with the text from group 1 and group 2.

    0 讨论(0)
  • 2020-12-19 03:18

    Another awk solution could be useful if you have many columns

    awk -F'|'  '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file
    
    0 讨论(0)
  • 2020-12-19 03:24

    Using cut is the right answer, but if you really want to use awk it's easier than Kent shows:

    awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}'
    

    Just shuffle the fields after $3 down, then by altering the value of NF you change the number of fields.

    0 讨论(0)
提交回复
热议问题