Как добавить определенную строку в файле в конец определенной строки в другом файле? (возможно, используйте sed)

Я получаю ту же последовательность проблем с моим модулем Wi-Fi HP 15 -ay188nb (rtl8723be ). Я иду в магазин (он был еще на гарантии )и я получаю его обратно с 2 антенами исправными (без объяснений ), поэтому я подозреваю плохую сборку или бракованный модуль. Это было до последнего обновления ядра, так что, вероятно, это не связано с ядром, просто совпадение! Mint 19.1, ядро ​​4.15.0 -47 -универсальный #50 -Ubuntu SMP ср 13 марта 10 :44 :52 UTC

0
16.04.2020, 21:03
2 ответа

Вы можете использовать этот awkскрипт:

awk 'NR==FNR && /^rng_samp_rate/ { value=$0 } 
     NR!=FNR && !/^sbas/         { print }
     NR!=FNR && /^sbas/          { print $0 " -" value }' supermaster.PRM script.in > script.out

Первый файл должен быть файлом параметров,второй файл сценария оболочки, который необходимо изменить. (Этот скрипт awkпринимает последнее вхождение rng_samp_rate.)

Вывод

#!/bin/bash
#SBATCH --job-name=InSAR
#SBATCH --ntasks=128
#SBATCH --time=7-00:00:00
#SBATCH --mail-type=fail,end
#SBATCH --export=all
#SBATCH --out=Forge-%j.out
#SBATCH --mem=256000

module load GMT
module load GMTSAR
module load parallel
sbas intf.tab scene.tab 19 10 8469 6097  -rng_samp_rate       = 64345238.125714 
csh plot_sbas.csh

Конечно, вы также можете использовать другие инструменты, такие как grepи sed.

sed "s/^sbas.*/& -$(grep '^rng_samp_rate' supermaster.PRM|head -1)/" script.in > script.out

или, может быть, немного проще для понимания

#! /bin/sh
VALUE="$(grep '^rng_samp_rate' supermaster.PRM|head -1)"
sed "s/^sbas.*/& -$VALUE/" script.in > script.out

(Здесь я использую первое вхождение rng_samp_rate.)

Обе команды предполагают, что никакие другие строки не начинаются с rng_samp_rateили sbasи что файл параметров всегда содержит строку rng_samp_rate. Сценарий sedпредполагает, что строка значения из файла параметров не содержит /.


Редактировать :Как изменить файл сценария вместо создания нового выходного файла?

Некоторые команды, напр. sed, поддержка редактирования места -, которое можно использовать для изменения файла сценария без явного создания отдельного выходного файла.

sed  -i.bak -e "some script" script.in

Как правило, после команды всегда можно использовать подходящую команду mv, например.

awk 'some script' supermaster.PRM script.in > script.out && mv script.out script.in

Команда &&гарантирует, что исходный сценарий будет перезаписан только в том случае, если команда awkне указала на ошибку.

Если вы хотите сделать больше модификаций, вы можете расширить awkили sedскрипт (для лучшей производительности )или запустить несколько скриптов последовательно или подключиться к каналу. (Для получения подробной информации необходимо написать дополнительные требования.)

0
19.03.2021, 02:28

Вы можете написать это с помощьюed:

printf '%s\n' \
  '/^sbas /s/$/ -/' \
  '. r !grep ^rng_samp_rate supermaster.PRM | head -1' \
  '-1,.j' \
  'w' \
  'q' | ed -s shellscript

Это изменяет (первую )строку, которая начинается с текста " sbas", добавляя пробел и тире. Затем он считывает вывод команды оболочки в следующую строку; команда оболочки ищет текст «rng_samp_rate» в начале строки в supermaster.PRM, а затем использует head -1для получения только первого такого результата. Этот вывод затем соединяется с предыдущей строкой. Затем сохраняем файл на диск и выходим.

Если дополнительные пробелы в исходном тексте вызывают затруднения, их можно уменьшить, немного изменив шелл-код:

...
grep ^rng_samp_rate supermaster.PRM | head -1 | sed 's/  */ /'
...

... который просто добавляет команду sed, которая заменяет 1 или более пробелов одним пробелом. Если после знака равенства -могут появляться лишние пробелы, измените команду sed на:sed 's/ */ /g'.

0
19.03.2021, 02:28

Теги

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