我编写了以下代码:
Fileformat=$2
Fileresource=$1
for (( j=1; j<=3; j++ ))
{
First_Pos_resource=$(awk -F ';' 'NR=='$j'{print $3}' "${Fileformat}")
Length_resource=$(awk -F ';' 'NR=='$j'{print $4}' "${Fileformat}")
last_Pos_resource=$((Pos_resource+Length_resource))
range=${First_Pos_resource}"-"${last_Pos_resource}
OUtput_line=${OUtput_line}$(cut -c${range} "${Fileresource}")
}
echo $OUtput_line >> OutputFile.txt
Fileformat:是outputFile.txt应该遵循的结构。 Fileformat.txt定义: 名称;位置输出;位置在资源文件中;从资源文件中删除字符串的长度
Fileformat.txt如下所示:
first;1;15;2
second;3;6;4
blabla;7;23;8
Fileresource:它包含一行字符串,我们从中生成输出文件
它看起来像这样:
sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf
总结一下:文件资源+文件格式= OutputFile.txt
解释
first;1;15;2 + sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf = jd
second;3;6;4 + sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf = ffgd
blabla;7;23;5 + sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf = dfssd
所以在连接后我应该在输出文件中有这个结果:Output.txt看起来像这样
jdffgddfssd
我已经对上面的行进行了编码,但是在连接后生成的空格有问题
输出显示但不理想:
jd ffgd dfssd
答案 0 :(得分:1)
错误消息看起来您的变量未正确设置。如果无法访问您的精确输入文件,则很难对其进行调试;但复制/粘贴您的数据会为我生成range
这样的值:
range=15-+2
range=6-+4
range=23-+8
这显然是不正确的。如果您希望shell对该值执行算术运算,则需要使用((
算术表达式 ))
。
无论如何,你的循环看起来完全是内在的。此外,将整个脚本重构为单个Awk脚本将使其更高效,更简单。
awk -F ';' 'NR==FNR { res = res $0; next }
{ printf "%s", substr(res, $3, $4) }
END { print "" }' resource fileformat.txt
我没有得到您开出的输出,但我可能在数据中有一些复制/粘贴错误,或者误解了您想要计算子串偏移的确切程度。
(我忍不住纠正“资源”的拼写。)