Как заменить строку в одном файле, если шаблон присутствует в другом файле с помощью awk

Вот я и понял. На самом деле проблема была не в Linux или xrandr, но моя встроенная видеокарта просто не способна выводить 4k со скоростью 30 кадров в секунду, хотя она работала со скоростью 15 кадров в секунду, поэтому, если у вас возникла та же проблема, попробуйте меньшую частоту кадров.

5
25.01.2021, 13:07
3 ответа
awk -F'\t' '
  NR==FNR{ if ($5=="ViroHEX"){ viro=1 } next }
  viro && $1=="Software Version"{ $2="VIRO_v1" }
  1
' A.txt FS=" = " OFS=" = " B.txt > result.txt

Это заменяет второе поле(NOVA_v1)на VIRO_v1во втором файле, если первое поле равно Software Versionи ViroHEXприсутствует где-либо в 5-м столбце первого файла.

Я предполагаю, что разделитель полей второго файла<space>=<space>(не табуляция ).

6
18.03.2021, 22:34

Более простое решение, по моему скромному мнению. К сожалению, он использует другие инструменты, кроме awk.

awk '{print $5}' A.txt | grep -q VIROHEX && sed 2s/NOVA/VIRO/ B.txt

Часть перед && реализует условие, программа sedзаменяет текст в файле B.txt.

РЕДАКТИРОВАТЬ :Спасибо, AdminBee, за указание на ленивость моего решения. Лучше:

awk '{print $5}' A.txt | grep -q VIROHEX && sed '2s/=.*/= VIRO_v1/' B.txt
4
18.03.2021, 22:34

Аналогично решению Берндбауша , но нужно быть немного более внимательным к тому, что мы на самом деле сопоставляем и вставляем.

awk -F '\t' '$5 == "ViroHEX" { found = 1; exit } END { exit !found }' A.txt &&
sed '2 s/=.*/= VIRO_v1/' B.txt

Сначала используется awk, чтобы определить, встречается ли точная строка ViroHEXв пятом поле с разделителями табуляции -в любой строке файла A.txt. Он не читает больше файла, чем необходимо, и завершает работу со статусом выхода, который позже используется для условного запуска sed.

Команда sedзаменяет все, начиная с первого символа =во второй строке B.txtстрокой = VIRO_v1.

Если файл A.txtне содержит ViroHEXв пятом столбце, вывод не производится.

Следующий вариант всегда создает файл B.txt, возможно, с заменой во второй строке:

if awk -F '\t' '$5 == "ViroHEX" { found = 1; exit } END { exit !found }' A.txt
then
    sed '2 s/=.*/= VIRO_v1/'
else
    cat
fi <B.txt

Если вместо изменения строки 2 вы хотите изменить строку с текстом Software Version =..., измените выражение, используемое в вызовах sed, на

s/^\(Software Version = \).*/\1 VIRO_v1/
4
18.03.2021, 22:34

Теги

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