shell脚本中的Awk脚本

shell脚本中的Awk脚本,shell,awk,Shell,Awk,我编写了一些在{a..z}.txt文件上循环时要执行的awk脚本。我已经盯着这个代码看了30分钟了,但我就是找不到哪里出了问题。终端抱怨>,但我不认为这就是错误所在 基本上,我想做的是: 每行包含一个字符串和以下一组数字。我想重新打印数字,以便第一个数字是其中最小的一个 输入:a 1125159 255429047364290 47392510 48629708 68 60771 输出:a2901125159 2554 47364290 47392510 48629708 68 60771 有人

我编写了一些在{a..z}.txt文件上循环时要执行的awk脚本。我已经盯着这个代码看了30分钟了,但我就是找不到哪里出了问题。终端抱怨>,但我不认为这就是错误所在

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

输入:a 1125159 255429047364290 47392510 48629708 68 60771

输出:a2901125159 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 
{a..z}中字母的

做
awk-F$'\t''NF>2{maxId=\$2;maxIndex=2;
对于(i=2;i\$i){maxId=\$i;maxIndex=i}
}; 
printf\%s\t%s\t\”,\$1,最大ID;

对于(i=2;i以下是脚本的编写方式:

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
awk'BEGIN{FS=OFS=“\t”}
NF>2{
minIndex=2
对于(i=3;i$i){
minIndex=i
}
}
打印文件“%s%s%s”$1,OFS$minIndex
对于(i=2;i2{
minIndex=2
对于(i=3;i$i){
minIndex=i
}
}
打印文件“%s%s%s”$1,OFS$minIndex>out
for(i=2;i=1)
}
}
打印“>
}“*”合并

既然您在awk脚本中没有使用任何环境变量,为什么不将整个内容单独引用,即,
awk-F“\t”{…}'$alpha.merged>$alpha.out
?当然,还可以删除
上的所有额外引用
$
字符。祝你好运。@Sheller,但我仍然需要转义awk变量,如$1、$2…,对吗?不,你不需要转义
I
$I
(取决于你的需要)。此外,简化调试,只需尝试
awk'…'a.merged>a.out
即可工作(注释掉循环,直到你让awk代码在alpha中至少运行1个字母)。祝你好运。@Sheller感谢它运行!!!!@EdMorton Ed,我实际上在stackoverflow上发布了一个类似的问题,并遵循了给出的建议。()但我会看看那本书,谢谢!
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