Создание новых столбцов в определенных позициях путем суммирования по строкам других столбцов

#awk

#awk

Вопрос:

Я хотел бы преобразовать этот файл, добавив два столбца с результатом суммирования значения в другие столбцы. Я бы хотел, чтобы эти новые столбцы располагались рядом с соответствующим суммированным столбцом.

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

  

Я хотел бы получить следующие данные

  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

  

Я нашел, как суммировать столбец: awk '{{$2 = 999}; print $0}' myFile но это преобразует второй столбец вместо создания нового. Кроме того, я не уверен в том, как добавить этот столбец в нужные позиции.

Спасибо!

Ответ №1:

 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
  

И аналогично для 4-го столбца.

Ответ №2:

Пример конкретного ответа: Не могли бы вы попробовать следующее, написанное и протестированное с показанными примерами в 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
  


Общее решение: добавление более общего решения, где нам НЕ нужно писать логику поля для каждого поля, просто укажите номер поля внутри переменной fieldsChange (укажите только номер поля через запятую), и даже заголовок будет обработан. переменная valAdd имеет значение, которое вам нужно добавить в новые столбцы.

 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
  

Комментарии:

1. Что означает последнее 1 в командной строке? непосредственно перед завершением инструкции awk. Спасибо!

2. @Jeni, 1 это один из способов awk печати текущей строки. awk работает по методу condition/pattern then action . Если какое-либо условие / шаблон истинно / соответствует, то будет выполнено действие, указанное после него; упоминая 1 , что здесь мы выполняем условие true, и здесь не указано никаких действий, поэтому по умолчанию произойдет печать текущей строки, приветствия.