使用awk替换模板文件占位符为其他文件字段并生成多输出文件问题
解决模板字符串批量替换并生成对应文件的问题
先来说说你原命令的问题出在哪:
- 你在处理
file2时用NR作为数组索引,但NR是全局行号,表头行NR=1被跳过,实际数据行的索引是2、3...;而处理file1时,循环i的范围是1到FNR(file1只有1行的话就是i=1),这时候取到的数组值是表头的FILENAME、FIELD_1、FIELD_2,自然生成了错误的文件。 - 另外你直接在循环里修改
$0,会导致多次替换时覆盖原模板内容,而且没有关闭文件句柄,当数据量大会触发系统文件数限制。
这里给你一个更简洁且正确的awk命令,完全匹配你的需求:
awk -F '\t' ' # 读取file1的模板内容,存到变量里(因为file1固定不变,只需要读一次) NR == FNR { template = $0; next } # 跳过file2的表头行,处理每一行数据 NR > 1 { # 复制模板,避免修改原内容影响后续行处理 tmp = template # 替换STRING_1为当前行的FIELD_1($2) gsub(/STRING_1/, $2, tmp) # 替换STRING_2为当前行的FIELD_2($3) gsub(/STRING_2/, $3, tmp) # 将替换后的内容写入到FILENAME指定的文件($1) print tmp > $1 # 关闭文件,避免打开过多文件句柄 close($1) } ' file1 file2.tab
命令解释:
NR == FNR { template = $0; next }:当处理第一个文件(file1)时,把整行内容存入template变量,然后用next跳过后续逻辑,直接处理下一行(file1只有一行的话就完成模板读取)。NR > 1:跳过file2的第一行表头,只处理数据行。- 每次处理数据行时,先复制模板到临时变量
tmp,避免修改原template导致后续替换出错。 - 两次
gsub分别完成两个字符串的替换,最后写入对应的输出文件,并用close关闭文件,防止系统打开文件数超限。
执行这个命令后,就能生成你需要的out1和out2文件,内容完全符合预期。
内容的提问来源于stack exchange,提问作者user31888
相关产品推荐
相关产品推荐

