Заменить определенные совпадения символов во всех строках, используя первую строку в качестве ссылки

У вас есть несколько незначительных проблем с кодом.

Попробуйте это:

#!/bin/bash

function addition_example(){
    local num1=$1
    local num2=$2
    local result=$((num1+num2))
    echo "Addition of the supplied arguments = $result"
}
addition_example "$1" "$2"
  • Функция была объявлена ​​в сценарии, но при простом выполнении сценария функция не выполнялась.
  • Аргументы, переданные сценарию (в качестве позиционных параметров ), не будут переданы функции, если они не указаны.
  • Вы не можете использовать пробелы вокруг =при назначении переменной с помощью bash
  • Ваш оператор echoдолжен быть заключен в кавычки, любая переменная должна быть заключена в кавычки.
2
30.03.2020, 20:45
1 ответ

Правильная идея -неправильная реализация

  1. вам нужно сохранить значения поля в массиве, проиндексированном по полю позиции . Поэтому вместо a[$i]сделайте этоa[i]=$i

  2. , то вам нужно искать значения по индексу в массиве. Так что не $i="a", а$i=a[i]

Кстати, $i == "\."не является проверкой регулярного выражения, поэтому вам не нужно экранировать.

$ awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[i]=$i } NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1' file
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T

Как указал Эд Мортон , вы можете улучшить решение, заменив явный цикл с помощью встроенной awk -в splitфункции:

awk -F'|' 'BEGIN{OFS=FS} NR==1 {split($0,a)} NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1'
6
19.03.2021, 02:31

Теги

Похожие вопросы