awk和for循环,具有多个变量

时间:2020-08-13 20:43:06

标签: shell for-loop awk

我正在尝试编写awk脚本以从txt文件读取数据,该文件需要具有三个变量的循环。尝试过C之类的语法和嵌套循环,但没有运气。

根据下面的链接,awk也不支持类似C的语法。

https://www.gnu.org/software/gawk/manual/html_node/For-Statement.html

增量部分也是如此。递增其他变量需要在循环结束时使用单独的语句。在这种情况下,使用C的逗号运算符的C复合表达式很有用,但awk不支持。

tst.awk

BEGIN { FS="," }
{
    printf "echo %s ", $1
    for (i=3; i<=NF;i=i+3) {
        printf " command1 " $i " command2 " $4 " command3 " $5, $i
        }
    print "command3"
}

test.txt

"a","b","c","d","e","f","g","h"
"m","n","o","p","q","r","s","t"

输出:

echo "a"  command1 "c" command2 "d" command3 "e" command1 "f" command2 "d" command3 "e"command3
echo "m"  command1 "o" command2 "p" command3 "q" command1 "r" command2 "p" command3 "q"command3

预期输出:

echo "a"  command1 "c" command2 "d" command3 "e" command1 "f" command2 "g" command3 "h"command3
echo "m"  command1 "o" command2 "p" command3 "q" command1 "r" command2 "s" command3 "t"command3

2 个答案:

答案 0 :(得分:2)

请注意<div class="adjustable"> <div class="fivebox" id="trand1"> <p>test</p> </div> <div class="fivebox"> <p>test</p> </div> <div class="fivebox"> <p>test</p> </div> <div class="fivebox"> <p>test</p> </div> <div class="fivebox"> <p>test</p> </div> </div>。第一个参数是格式字符串,扫描printf个字符。
在您输入的情况下,该错误代码将起作用:

%

更佳的是awk -F"," ' { printf "echo %s ", $1 for (i=3; i<=NF;i=i+3) { printf " command1 " $i " command2 " $(i+1) " command3 " $(i+2) } print " command3" }' test.txt

printf

答案 1 :(得分:2)

另一种方法是从当前循环索引向后看,并基于$(i-2)$(i-1)$i输出。那将需要以i=5开始,例如

awk -F, '{
    printf "echo %s ", $1
    for (i = 5; i <= NF; i += 3)
        printf " command1 %s command2 %s command3 %s", $(i-2), $(i-1), $i
    print ""
}' test.txt

在这种情况下,您将产生所需的输出:

echo "a"  command1 "c" command2 "d" command3 "e" command1 "f" command2 "g" command3 "h"
echo "m"  command1 "o" command2 "p" command3 "q" command1 "r" command2 "s" command3 "t"

使用awk来换个方式的另一种方式。

您真的要额外的命令3吗?

您的输出显示您最后需要一个附加的command3。这似乎很尴尬,但是如果需要的话,只需将其添加到最后的print中即可,例如,完成后输出换行符,例如

     print "command3"

您的输出是:

echo "a"  command1 "c" command2 "d" command3 "e" command1 "f" command2 "g" command3 "h"command3
echo "m"  command1 "o" command2 "p" command3 "q" command1 "r" command2 "s" command3 "t"command3