#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
thenaction
. Если какое-либо условие / шаблон истинно / соответствует, то будет выполнено действие, указанное после него; упоминая1
, что здесь мы выполняем условие true, и здесь не указано никаких действий, поэтому по умолчанию произойдет печать текущей строки, приветствия.