每个参数的 awk 命令

每个参数的 awk 命令

awk在 bash 脚本中有一个实现,我想使用 do 循环为每个函数 arg 运行。每个 arg 由多行字符串组成。

for arg in "$@"; do

done

这是 awk 实现,用于<<< "$@"传递所有函数参数。

我想要的是单独使用每个参数,arg而不是像 一样传递所有参数"$@"

 awk '
   BEGIN {
     kl=0
     kmd="tput sgr0"
     rst = ( (kmd | getline outp) > 0 ? outp : "<" "sgr0" ">" )
     close(kmd)
     ka = "Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214"
     kb = "Cyn 51 Mgn 201 Syp 39 Code 39"
     ks = sprintf("%s %s", ka, kb)
     n = split(ks, kaggr)  # split makes kaggr start at index 1
     for ( i=1; i<n; i+=2 ) {
       knam = kaggr[i] ":"
       knum = kaggr[i+1]
       kmd=sprintf("%s%d\n", "tput bold; tput setaf ", knum)
       tseq[knam] = ( (kmd | getline outp) > 0 ? outp : "<" knam ">" )
       close(kmd)
      }
    }

   ## Detect keyword in index of array tseq, tseq[indx].
   ($1 in tseq) { kl=1 ; ctp=$1 ; next }

   /Rst:/ { kl=0 ; next }  # Reset colour rendition

   kl { print tseq[ctp] $0 rst }  # Print with specified colour
   !kl { print }                  # Use terminal text colour
' <<< "$@"

在之前的工作中,我遇到了管道中存在循环时变量消失的问题。有关更多详细信息,请参阅 [https://mywiki.wooledge.org/BashFAQ/024][1]。

尽管我认为对于 awk 的管道传输来说,变量消失的问题并不真正重要。

答案1

看起来您的循环正在用作arg循环变量,并且您应该能够使用<<<"$arg"该变量将该变量的内容重定向到您的awk代码中:

for arg do
  awk '...as in the question...' <<<"$arg"
done

或者,如果您想进行更多输入并记住在 周围添加双引号$@

for arg in "$@"; do
  awk '...as in the question...' <<<"$arg"
done

您还可以使用 传递标准输入上的数据printf,这将使循环符合 POSIX 标准(<<<此处字符串重定向不是标准的):

for arg do
    printf '%s\n' "$arg" | awk '...as in the question...'
done

所有这些循环变体都会awk为列表中的每个列表元素运行一次代码"$@",无论它们是否是多行的。

请注意,我并没有真正查看您的awk代码,因为问题在于代码输入的管理。

相关内容