2012-03-29 7 views
0

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

#!/bin/bash/ 
cp /dir1/dir2/FILE_to_be_modified . ; 
var ="$1 $1 $1"; 
awk -v li=4 -v new="$var" '{ 
     if (NR==li) { 
        print new; 
     } else { 
       print $O; 
     } 
}' FILE_to_be_modified>>new_FILE 

с этим я мог модифицировать линию 4 из FILE_to_be_modified, но всегда с узорами, как 9 9 912 12 12, теперь я хотел бы что-то вроде 9 9 11 или 12 12 14. Я пробовал глупо думать, как изменить var на $1 $1 $1+2. следует использовать bc?

+1

необходимо удалить слэш из притон линии. –

ответ

3

Bash арифметика:

var = "$1 $1 $(($1 + 2))" 

Посмотрите the docs и the tutorial.

+0

Большое спасибо за вашу помощь и за ссылки !!! Я думаю, что нет необходимости говорить, что он отлично работал! – ziulfer

1

Когда вы пишете var ="$1 $1 $1", вы даете bash, а не awk, разверните переменные. $1 случайно имеет значение как в awk, так и в bash. Итак, теперь вы заменяете строку тремя вхождениями первого аргумента, переданного вашему скрипту. Изменяя его, например, var ="$1 $2 $3" вы будете использовать 3 первых параметра, переданных вашему скрипту. Если, с другой стороны, ваша цель - заменить строку на значения первого поля, как видно на awk, используйте одну цитату: var ='$1 $1 $1'. Таким образом, bash не будет расширять его, только awk будет, и если вы измените его на var ='$1 $2 $3', вы замените линию на первые 3 поля исходного значения (см. awk).

0

В качестве альтернативы, вы можете передавать арифметику в AWK

#!/bin/sh 
awk -v li=4 -v val="$1" ' 
    NR==li {print val, val, val+2; next} 
    {print} 
' /dir1/dir2/FILE_to_be_modified >> ./new_FILE 
Смежные вопросы