我有一个包含字符串和数字的文本文件。我想创建一个搜索给定字符串的短脚本,如果找到该字符串,它会将该行的第n个以空格分隔的参数乘以缩放因子,并将所有内容保存到新文件中。
我们可以假设文件中只有一个这样的字符串,并且该行上的第n个参数也是浮点数。理想情况下,程序也会保留原始文件的格式
例如,搜索字符串“ab ce”并将该行的第四个参数乘以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
答案 0 :(得分:0)
使用GNU awk
的解决方案:
awk -v pattern="ab ce" -v scale=2.0 -v col=4 -f input.awk inputfile.txt
input.awk
:
pattern {
count = split($0, fields, / +/, seps);
printf fields[1];
for (i = 2; i <= count; i++) {
if (i == col) {
len = length(seps[col-1] fields[col]);
printf("%" len ".1f", fields[4] * scale);
} else {
printf(seps[i-1] fields[i]);
}
}
print "";
next;
}
{ print }