shell脚本中的awk脚本

时间:2016-02-26 04:37:00

标签: shell awk

我在循环{a..z} .txt文件时编写了一些要执行的awk脚本。我一直盯着这段代码30分钟,但我找不到什么是错的。终端抱怨>周围有一些语法错误,但我认为这不是bug的地方。

基本上,我要做的是: 每行包含一个字符串和一组以下数字。我想重新打印数字,以便第一个数字是最小的数字。

输入:a 1125159 2554 290 47364290 47392510 48629708 68 60771

输出:a 290 1125159 2554 47364290 47392510 48629708 68 60771

有人可以帮我找到下面的代码有什么问题吗?

for alphabet in {a..z} 
 do 
   awk -F$'\t' "NF>2{maxId=\$2;maxIndex=2;
             for(i=2; i<=NF; i++){
                if(maxId>\$i){maxId=\$i; maxIndex=i}
                }; 
             printf \"%s \t %s \t\",\$1, maxId; 
             for(i=2; i<=NF; i++){
                if(i!=maxIndex) 
                    printf \"%d \t\", \$i}; 
                    printf \"\n\";
                }" $alphabet.merged > $alphabet.out
    done 

1 个答案:

答案 0 :(得分:0)

这里是你的脚本应该如何编写的:

awk 'BEGIN { FS=OFS="\t" }
NF>2 {
    minIndex = 2
    for (i=3; i<=NF; i++) {
        if ( $minIndex > $i ) {
            minIndex = i
        }
    }

    printf "%s%s%s", $1, OFS, $minIndex
    for (i=2; i<=NF; i++) {
        if ( i != minIndex ) { 
            printf "%s%s", OFS, $i
        }
    }
    print ""
}' file
a       68      2554    290     47364290        47392510        48629708        1125159 60771

不要回避白色空间和括号,因为它们有助于提高可读性。我不明白你问题中周围shell循环的目的 - 我怀疑你真正需要的是:

awk 'BEGIN { FS=OFS="\t" }
FNR==1 { close(out); out=FILENAME; sub(/merged/,"out",out) }
NF>2 {
    minIndex = 2
    for (i=3; i<=NF; i++) {
        if ( $minIndex > $i ) {
            minIndex = i
        }
    }

    printf "%s%s%s", $1, OFS, $minIndex > out
    for (i=2; i<=NF; i++) {
        if ( i != minIndex ) { 
            printf "%s%s", OFS, $i > out
        }
    }
    print "" > out
}' *.merged