替换awk中的字符

use*_*597 1 awk

我正在使用以下命令对文件进行操作:

awk '{delta = $1 - avg; avg += delta / NR; mean2 += delta * ($1 - avg); } END { print avg" "sqrt(642)*sqrt(mean2 / NR); }' param_A_ratio_re_truncated.txt
Run Code Online (Sandbox Code Playgroud)

现在,我想立即重复此命令行,但将文件名中的“A”替换为“D、G、K、M”等,而不是每次都键入该行。虽然我可以替换文件名中的数值,但我不确定如何更改字符。任何建议,将不胜感激。谢谢。

mar*_*rkp 5

你可以试试:

awk '.....' param_[ADGKM]_ratio_re_truncated.txt
Run Code Online (Sandbox Code Playgroud)

...但这将生成单个 avg/sqrt/mean 输出(即awk脚本将所有文件作为一大组数据处理)。

如果目的是为每个文件生成单独的 avg/sqrt/mean,则有一个简单/快速的解决方案:

for fname in param_[ADGKM]_ratio_re_truncated.txt
do
    echo "######### input: ${fname}"
    awk '.....' "${fname}"
done
Run Code Online (Sandbox Code Playgroud)

您可以使用单个awk脚本来处理所有文件为每个文件生成单独的 avg/sqrt/mean,但它需要更多代码,例如:

awk '
function print_output() {
    if (rowcnt > 0)
        print FILENAME, avg, sqrt(642)*sqrt(mean2 / rowcnt)
    delta = avg = mean2 = ""                          # reset variables for next file
    rowcnt = 0
}

FNR==1 { print_output() }                             # FNR==1 => new file so print results for previous file
       { rowcnt++
         delta = $1 - avg
         avg += delta / rowcnt
         mean2 += delta * ($1 - avg)
       } 
END    { print_output() }                             # print results for last file
' param_[ADGKM]_ratio_re_truncated.txt
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 'FILENAME,'如果您不想显示每个文件的名称,请删除
  • 假设所有文件至少有一行输入,否则可能需要一些额外的逻辑来处理“空”文件
  • 无法测试,因为没有样本输入,也没有预期输出
  • 我假设 OP 的当前代码按预期工作(即,我没有尝试验证 OP 的当前代码)