0

我的 CSV 文件有 47 列,我想通过某个字段的值选择第 36 - 47 列。从第 36 到 47 列开始,每个条目是这样的:“1/1:0,297: 297 :99:10476,951,0”

我使用下面的 AWK 代码用“:”分割这个条目,并检查 array[3] >= 20(上面突出显示的是 array[3] 中的 297。如果它通过检查,则将条目打印到新的CSV,否则打印出“./.”。我需要无条件打印出前 35 列。

当我在名为 awk_byDP (chmod u+x) 的文件中运行以下代码时,它给了我这个错误:

/usr/bin/awk: 源代码第 6 行源文件中的语法错误 ./awk_byDP 上下文是

? <<< /usr/bin/awk: 源代码第 6 行源文件 ./awk_byDP 处的非法语句

#!/usr/bin/awk -f

BEGIN {-F","; OFS=","}
 NR <= 1 {next}
 NR > 1 {
     for (j=1; j<=35; j++) { printf("%s",  $j) } #line 6  

     for (i=36; i<=47; i++) {
     t=$i;
     split(t,a,":")
     if ( a[3]>=20 ) {
            printf(“%s”, $i)
       }  
       else {
          printf(“%s”, "./.")
       }
     }
    printf("\n")
}
4

2 回答 2

2

您的语法错误在 BEGIN 部​​分。改变这个:

BEGIN {-F","; OFS=","}

对此:

BEGIN {FS=OFS=","}

您也有一些小问题,主要是外观/样式问题,这是您脚本的清理版本:

BEGIN { FS=OFS="," }
NR > 1 {
    for (j=1; j<=35; j++) {
        printf "%s",  $j
    }  

    for (i=36; i<=47; i++) {
        split($i,a,/:/)
        if ( a[3]>=20 ) {
            printf "%s", $i
        }  
        else {
            printf "./."
        }
    }
    print ""
}
于 2013-11-01T16:27:42.263 回答
0

改成 :

 for (j=1; j<=35; j++) { printf "%s",  $j }
于 2013-10-31T18:05:14.323 回答