Jeni
Jeni

Reputation: 958

Create new columns in specific positions by row-wise summing other columns

I would like to tranform this file, by adding two columns with the result of summing a value to another columns. I would like this new columns to be located next to the corresponding summed column.

 A        B     C 
2000    33000   2
2000    153000  1
2000    178000  1
2000    225000  1
2000    252000  1

I would like to get the following data

 A     A1    B     B1       C 
2000  2999  33000  33999    2
2000  2999  153000 153999   1
2000  2999  178000 78999    1
2000  2999  225000 225999   1
2000  2999  252000 252999   1

I have found how to sum a column: awk '{{$2 += 999}; print $0}' myFile but this transforms second column, instead of creating a new one. In addition, I am not sure about how to append that column in the desired positions.

Thanks!

Upvotes: 2

Views: 68

Answers (2)

RavinderSingh13
RavinderSingh13

Reputation: 133538

Sample specific answer: Could you please try following, written and tested with shown samples in GNU awk.

awk '
FNR==1{
  $1=$1 OFS "A1"
  $2=$2 OFS "B1"
  print
  next
}
{
  $1=$1 OFS $1+999
  $2=$2 OFS $2+999
}
1
' Input_file | column -t


Generic solution: Adding more generic solution, where we need NOT to write field logic for each field, just give field number inside variable fieldsChange(give only field number with comma separated) and even heading of it will be taken care. variable valAdd is having value which you need to add into new columns.

awk -v valAdd="999" -v fieldsChange="1,2" '
BEGIN{
  num=split(fieldsChange,arr,",")
  for(i=1;i<=num;i++){ value[arr[i]]       }
}
FNR==1{
  for(i=1;i<=NF;i++) {
    if(i in value)   { $i=$i OFS $i"1"     }
  }
}
FNR>1{
  for(i=1;i<=NF;i++) {
    if(i in value)   { $i=$i OFS $i+valAdd }
  }
}
1
' Input_file | column -t

Upvotes: 4

KamilCuk
KamilCuk

Reputation: 141145

awk '{
    # increase number of columns
    NF++
    # shift columns right, note - from the back!
    for (i = NF; i >= 2; --i) {
        $(i + 1) = $i
    }
    # increase second column
    $2 += 999
    # print it
    print
}
' myfile

And similar for 4th column.

Upvotes: 5

Related Questions