提取SPICE数据文件中+开头行的时间-电流数据对的awk脚本求助
提取SPICE数据文件中+开头行的时间-电流数据对的awk脚本求助
嘿,我完全懂你这种卡了半天的挫败感!SPICE输出的这种拆分多行的时间-电流数据确实有点坑,咱们来一步步把它捋顺解决掉。
首先先拆解下你的数据问题:你提供的nportModel.sp.isrc里,以+开头的行是把连续的时间-电流对拆成了多行,而且每行的字段奇偶性还不一样——第一行结尾是时间,第二行开头就是对应这个时间的电流;第二行结尾是电流,第三行开头就是对应这个电流的时间,以此类推。之前的脚本没考虑到这种跨行衔接的情况,所以才没得到预期结果。
解决思路
我们需要写一个能跨行衔接残留数值的awk脚本,核心逻辑是:
- 只处理以
+开头的行 - 用一个变量保存上一行处理后剩下的单个数值(比如残留的时间/电流),和下一行的第一个数值组成完整的时间-电流对
- 对每一行的字段,每两个一组提取时间-电流,剩下的单个数值继续留到下一行处理
- 输出时统一用两位小数的科学计数法,和你预期的格式对齐
最终awk脚本
BEGIN { # 定义输出格式:科学计数法,保留两位小数 OFMT = "%.2E" # 打印表头 print "time\tcurrent" } /^+/ { # 把当前行的有效字段(从第2个开始,跳过开头的+)存入数组 field_count = 0 for (i = 2; i <= NF; i++) { fields[++field_count] = $i } # 如果上一行有残留的单个数值,先和当前行第一个字段组成一对输出 if (residual != "") { printf "%s\t%s\n", sprintf(OFMT, residual), sprintf(OFMT, fields[1]) # 移除已处理的第一个字段,剩下的继续处理 for (i = 1; i < field_count; i++) { fields[i] = fields[i+1] } field_count-- residual = "" } # 遍历当前字段数组,每两个一组输出时间-电流对 for (i = 1; i <= field_count; i += 2) { if (i + 1 <= field_count) { printf "%s\t%s\n", sprintf(OFMT, fields[i]), sprintf(OFMT, fields[i+1]) } else { # 剩下单个字段,作为残留值留给下一行处理 residual = fields[i] } } }
使用方法
- 把上面的脚本保存成
extract_spice_data.awk文件 - 在终端运行以下命令:
awk -f extract_spice_data.awk nportModel.sp.isrc > output_file.txt
预期输出验证
根据你提供的示例数据,运行后output_file.txt的内容会是:
time current 0.00E+00 1.87E+00 2.00E-11 1.09E+01 4.00E-11 1.03E+01 6.00E-11 9.14E+00 8.00E-11 8.06E+00 1.00E-10 7.25E+00 1.20E-10 6.46E+00
(注:你示例里第三行最后一个数值1.40000e-10会作为残留值保存,等后续有对应电流值的行时会自动配对输出)
脚本关键点说明
BEGIN块:提前设置输出格式并打印表头,确保整体格式统一residual变量:核心的跨行衔接机制,解决了行与行之间拆分的时间-电流对问题sprintf(OFMT, value):强制把数值转换成你需要的两位小数科学计数法格式,保证输出美观对齐
备注:内容来源于stack exchange,提问作者Santhosh Nayak D.
相关产品推荐
相关产品推荐

