Изменение значений в нескольких строках и столбцах с помощью awk - PullRequest
0 голосов
/ 04 марта 2020

У меня есть список значений. Я хочу сместить значения в указанных c строках и 2-м столбце на 0,2. То есть -

1 2 3
4 5 6  
7 8 9

в

1 2.2 3
4 5 6
7 8.2 9

....

for row in 1, 3,6,24,41,47,42,48,29,35,30,36,17,23,18,24
do
slight_up_COORD=`echo "$slight_up_COORD"|awk 'FNR =="${row}" {a=$2} FNR=="${row}" {$2=a+0.2} {print}'`
done

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

Поскольку у вас уже есть список номеров записей в списке, разделенном запятыми, для обработки, мы будем практичны и используем его, считывая его из STDIN:

$ echo 1, 3,6,24,41,47,42,48,29,35,30,36,17,23,18,24 |
awk '
NR==FNR {
    for(i=1;i<=NF;i++)   # all comma-separated fields
        p[$i+0]          # hash and fix that space in the list with +0
        next             # on to the file
}

(FNR in p) {             # if the record number is in the p hash to be processed
        $2+=.2           # add 0.2 to $2 (this could be $2 ".2" but for change)
        # $2=$2 ".2"     # for non-numeric data
}1' FS=, - FS=\  file    # stdin first, comma delim, then file, space delim

Вывод:

1 2.2 3
4 5 6  
7 8.2 9
2 голосов
/ 04 марта 2020

Не могли бы вы попробовать следующее, где в split вам нужно определить все номера строк, для которых вы хотите добавить .2 в строках. Здесь я сделал для 1,3,6, вы могли бы упомянуть больше строк здесь.

awk '
BEGIN{
  num=split("1,3,6",array,",")
  for(i=1;i<=num;i++){
    array1[array[i]]
  }
}
FNR in array1{
  $2+=.2
}
1
' Input_file

Объяснение: Добавление подробного объяснения приведенного выше кода здесь.

awk '                               ##Starting awk program from here.
BEGIN{                              ##Starting BEGIN section of this awk program from here.
  num=split("1,3,6",array,",")      ##Splitting 1,3,6 values into array with delimiter comma and getting their total length(of passed line numbers) in variable named num here.
  for(i=1;i<=num;i++){              ##Starting a for Loop starting from i=1 to value of num
    array1[array[i]]                ##Creating array named array1 whose index is array[i] value.
  }
}
FNR in array1{                      ##Checking condition if current line number is present in array1 then do following.
  $2+=.2                            ##Adding .2 to current Line 2nd field here.
}
1                                   ##1 will print edited/non-edited lines here.
' Input_file                        ##Mentioning Input_file name here.
1 голос
/ 04 марта 2020

другой awk подход

$ seq 9 | paste -d' '  - - - | 
  awk -v rows="1,3,6,24" -v c=, 'c rows c ~ c NR c {$2+=.2}1'

1 2.2 3
4 5 6
7 8.2 9

если ваши данные находятся в файле

$ awk -v rows="1,3,6,24" -v c=, 'c rows c ~ c NR c {$2+=.2}1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...