首页 > 解决方案 > 根据列的值更改文件中某些字段的值

问题描述

我有一个由逗号分隔的文件,它有大约 50 列,可以达到 1M 行。

我想评估每一行的某些列,如 5、41、42、43、44、45、46、47、48、49 和 50 是否具有 Y|N|N/A 的值,如果没有,它将替换为另一个值,例如 E。我在该过程中使用 awk:

okfile="okfile"
awk -F, -v okfile="$okfile" '
  BEGIN {system("rm -f " okfile) }
  length > 0 {
     if (toupper($5) !~ /YES|NO|N\/A/ ) { $5="E",$0 >> okfile;numerr+=1;next }

     for (i=41;i<=50;i++)
        {  if (toupper($i) !~ /YES|NO|N\/A/)
           {
             $i="E",$0 >> okfile
             numerr+=1
             next
           }
        }
    }
 END {print numerr,"errors"}
' FILETOREAD.txt

这总是给我语法错误,我无法解决它:

syntax error The source line is 5.
The error context is
       if_(toupper($5) !~ /YES|NO|N\/A/ { >>> {$5="E", <<<
awk: The statement cannot be correctly parsed.
The source line is 5.

任何人都可以帮助我吗?

编辑第 5 行,最后出现拼写错误,使用 ) 而不是 }

标签: unixawksyntaxksh

解决方案


认为这可能是你想要做的(未经测试):

okfile="okfile"
awk '
    BEGIN {
        FS=OFS=","
        flds[++numFlds] = 5
        for (i=41; i<=50; i++) {
            flds[++numFlds] = i
        }
    }
    NF {
        for ( n=1; n<=numFlds; n++ ) {
            i = flds[n]
            if ( toupper($i) !~ /^(YES|NO|N\/A)$/ ) {
                $j = "E"
                numerr++
            }
        }
        print
    }
    END { print numerr+0, "errors" | "cat>&2" }
' FILETOREAD.txt  > "$okfile"

推荐阅读