尝试在 shell 脚本的循环中运行 awk 时出现“语法错误:循环变量错误”

尝试在 shell 脚本的循环中运行 awk 时出现“语法错误:循环变量错误”

我有一个awk在终端上运行良好的命令:该awk命令根据列标题创建不同的文件。 awk命令:

for((i=2;i<5;i++)); do 
    awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i > n".txt"}' ${Batch}.result.txt
done

当合并到 shell 脚本中时,相同的命令会显示错误:

Syntax error: Bad for loop variable

它的工作方式如下。我按照建议尝试使用 she-bang,但它重复了该错误。

for i in 2 3 4; do awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i  n".txt"}'

答案1

我认为该错误与您的Awk命令没有任何关系。我认为您正在 POSIX bourne shell 中运行它,sh其中((不支持 for 循环构造。

bash运行脚本,并将 shebang 设置为安装路径。通常这样做是安全的,因为#!/usr/bin/env bash搜索#!/usr/bin/env,并且并不总是在 中,特别是在非 Linux 系统上。对于 OpenBSD 系统,它位于.PATHbashbash/bin/usr/local/bin

答案2

该脚本很可能是由/bin/shbashksh93任何其他理解 C 类for循环的 shell)解释的。

确保脚本有#!一行说

#!/bin/bash

在文件的最顶部(更改为您要使用的 shell 和路径),或者显式使用正确的解释器运行脚本,例如:

bash ./scriptname

答案3

A三参数循环控制表达式巴什应指定为:

for (( EXP1; EXP2; EXP3 ))

但在你的简单情况下我只会使用:

for i in {2..4}; do ...

答案4

为了完整起见,您的 ksh93-syntax 命令的 POSIX 等效项(因此可以与sh包含您的ash基于 shelldash或 busybox的任何现代实现一起使用ash)将是:

i=2; while [ "$i" -lt 5 ]; do
  awk -v i="$i" '
    BEGIN{OFS=FS="\t"}
    NR==1{n=$i}
    {print $1,$i > n".txt"}' < "${Batch}.result.txt"
  i=$((i + 1))
done

虽然在这里,写它会更有意义:

awk -F '\t' -v OFS='\t' '
  NR == 1 {for (i = 2; i < 5; i++) file[i] = $i".txt"}
  {for (i = 2; i < 5; i++) print $1,$i > file[i]}' < "${Batch}.result.txt"

相关内容