解析文件中的标头并根据标头替换文件中的值

解析文件中的标头并根据标头替换文件中的值

我有以下文件

Field1|Field2|Field3|Field4|Field5
a|b|c|d|e
1|2|3|4|5
z|y|x|w|v

我有一个接受两个输入的脚本

script.sh Field3 T

script.sh 将采用“Field3”参数,并根据该列号将内容替换为“T”。

[编辑]

我尝试了@Costas 的以下建议,但遇到了问题。我的文件是这样的:

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2~Y~N~~0

如果我运行以下脚本

cat <filename> | awk -F'~' -v p='MODULE_ColumnD' -v r='99' 'NR==1{for (i=1;i<=NF;i++) if($i==p)f=i;print;next}$f=r'

它替换了值,但输出中缺少分隔符或替换为空格,如下所示:

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2 Y N 99 0

如何取回记录中的分隔符?

答案1

awk -F'|' -v p='Field3' -v r='T' '
    NR==1{
        for (i=1;i<=NF;i++)
            if ($i==p)
               f=i
        print
        next}
    $f=r
'

如果您想格式化它以使用,例如script.awk保存它:

#!/usr/bin/awk -f
BEGIN{
    OFS=FS="|"}
NR==1{
    for (i=1;i<=NF;i++)
        if ($i==p)
            f=i
    print
    next}
$f=r

并通过以下方式使其可执行chmod +x script.awk并使用:

./script.awk p=Field4 r=T input.file

相关内容