У меня есть текстовый файл, содержащий строки и цифры. Я хотел бы создать короткий скрипт, который ищет определенную строку, и если строка найдена, она умножает n-й разделитель, разделенный пробелом этой строки, на коэффициент масштабирования и сохраняет все в новый файл.
Мы можем предположить, что в файле будет только одна такая строка, а также что n-й аргумент в этой строке будет числом с плавающей запятой. В идеале программа также сохранит форматирование исходного файла.
Например, для поиска строки "абы с" и умножать четвертый аргумент этой линии от 2,0:Редактировать файл без изменения форматирования
./prog "ab ce" 4 2.0 inputfile.txt output.txt
inputfile.txt:
ab cd 1.0 2.0 3.0
ab ce 1.0 2.0 3.0
ac ce 1.0 2.0 3.0
ac ce de ef 1.0 2.0 3.0
output.txt
ab cd 1.0 2.0 3.0
ab ce 1.0 4.0 3.0
ac ce 1.0 2.0 3.0
ac ce de ef 1.0 2.0 3.0
Я попытался сделать это с помощью awk (ниже), однако это не сохраняет форматирование, и я подозреваю, что есть более элегантное решение. Может ли кто-то предложить другой подход?
#!/bin/sh
search_string=$1
n=$2
scaling=$3
inputfilename=$4
outputname=$5
awk -vORS= -v scal="$scaling" -v ch="$n" -v inp="$search_string" 'BEGIN {} {if($0 ~ inp){ s = ""; for (i = 1; i < ch; i++) s = s $i " "; print s; print $ch*scal," "; s = ""; for (i = ch+1; i <= NF; i++) s = s $i " "; print s,"\n" } else print $0,"\n" } END{}' $inputfilename>$outputname
Вы можете упростить 'awk' сценарий значительно: ' awk '/ ab ce/{$ 4 = $ 4 * 2.0} {print}' ' –