我在循环{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
答案 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