各パラメータのawkコマンド

各パラメータのawkコマンド

awk各関数引数に対してdoループを使用して実行したいbashスクリプトに実装があります。各引数は複数行の文字列で構成されます。

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

これらすべてのループバリアントは、複数行であるかどうかにかかわらず、awklistの各リスト要素に対してコードを一度実行します。"$@"

awk問題はコード入力管理にあるので、実際にあなたのコードを見ていません。

おすすめ記事