awkに渡された変数の数を取得する方法

awkに渡された変数の数を取得する方法

bashスクリプトでawkを呼び出し、bash変数の値を渡そうとします。これらの変数の数を取得し、awkから渡されたすべての変数を印刷する方法はありますか?

awkに渡される変数の数は動的です。

以下の例

#!/bin/bash
NAME="Dell"
SERIAL="12345"
echo "Hello" | awk -v a=$NAME -v b=$SERIAL '{ print a,b }'

参照、作業例、Irvurの答えはここにあります。

#!/bin/bash

function confirm_peers (){
  header_def=("${header_def[@]:-None}")
  read -r -p "Enter nodes from header[${header_def[*]}]: " -a header
  header=("${header[@]:-${header_def[@]}}") ;
  echo -e "\nInput Recorded - ${header[@]} \n"
}

createEncConfig()
{
 /usr/bin/awk -f - <<-'EOE' ${header[*]}  FS=":" $1
  BEGIN {
    count=1
    for (i = 1; i < ARGC - 2; ++i) {
    split(ARGV[i], ar, "=");
    print ar[2]
    }
print "\nCount=" ARGC -3
        }
EOE
}
confirm_peers
# Making array content adaptable to awk input
for x in ${!header[@]} ; do header[x]="a=${header[x]}"; done
createEncConfig $1

参照 - これまでの最も簡単なKusalalanandaの答え

#!/bin/bash

function confirm_peers (){
  header_def=("${header_def[@]:-None}")
  read -r -p "Enter nodes from header[${header_def[*]}]: " -a header
  header=("${header[@]:-${header_def[@]}}") ;
  echo -e "\nInput Recorded - ${header[@]} \n"
}

createEncConfig()
{
/usr/bin/awk -v args="${header[*]}" -f - <<-'EOE' FS=":" $1
BEGIN {
  count=split(args,ar," ")
  for ( x in ar ) {
    print ar[x]
  }
print "\n" count
}
EOE
}
confirm_peers
createEncConfig $1

出力:ダミーファイルを渡します。

$bash /tmp/a.bsh /tmp/enc1.txt

Enter nodes from header[None]: a b c d

Input Recorded - a b c d

a
b
c
d

Count=4

みんなありがとうございます..

答え1

私が考えることができる1つのオプションは、これらの変数が表示されるように場所を変更することですARGV。これにより、ブロック内でARGC変数を使用できなくなります。BEGINまた、引数として渡したファイル名については、そのファイルawk数を減算して説明する必要があります。ARGC

echo "Hello" | awk  '{ print a, b, ARGC - 1}' a=$NAME b=$SERIAL
DELL 12345 2

答え2

~からあなたのコメント、コマンドラインからプログラムbashに渡したい配列があるようです。awk

簡単な方法は次のとおりです。

array=("my 1st item" "my 2nd item" "the last item")

(
    IFS=:

    awk -v var="${array[*]}" '
        BEGIN {
            array_len = split(var, array, ":")
            for (i = 1; i <= array_len; ++i)
                printf("Item #%d is \"%s\"\n", i, array[i])
        }'
)

これは出力されます

Item #1 is "my 1st item"
Item #2 is "my 2nd item"
Item #3 is "the last item"

その後、配列を取得し、:- で区切られた項目で構成される単一の文字列に変換します。配列の要素にが含まれている場合は、文字列内の項目を区別するために:別の文字が選択されます。拡張は${array[*]}配列内の項目を最初の文字に関連付けるため、$IFS拡張を実行する前にこの変数を設定します。文字列はawk変数として渡されますvar

プログラムBEGINブロックからawk配列を作成し、それらを分割して配列の長さを追跡しますarray。このループは、文字列が正常に分割されたことを示すためのものです。array_lenvar:

変更されていない変数を使用してスクリプトの残りの部分を実行できるように、サブシェルでプログラムを設定してIFS実行します。awkIFS

答え3

これで、独自のコマンドラインとそのオプションを取得する方法が提供されていないため、これはファイルシステムなどのLinux内部awkに依存するいくつかの拡張ですが、ただ楽しさのためのものです(YMMV)。proc

awk -v"VAR1=sd" -va=b -vJ=onny '
BEGIN   {("tr \47\\000\\n\47 \47\t\47 </proc/$PPID/cmdline") | getline CMDLN
         n = split (CMDLN, ELM, "\t")
         for (i=1; i<=n; i++)   if (sub ("^-v", "", ELM[i]))    {split (ELM[i], T, "=")
                                                                 print "Option", T[1], "=", T[2]
                                                                 Options++
                                                                } 
        }
'
Option VAR1 = sd
Option a = b
Option J = onny

読み取っている「コマンド」はgetlineサブシェルで実行されるため、親PIDのコマンドラインとsとtr文字を取得します。その後、CMDLNはその要素に移動し、各要素の先行する「-v」を一致(および削除)して変数定義を見つけます。これが印刷され、オプションの数が増加します。試してみてください。<NUL><LF><TAB>split

答え4

bash配列があり、bashは配列にいくつの要素があるかどうかを知っているので、awkに直接教えてください。

$ array=("my 1st item" "my 2nd item" "the last item")
$ awk -v var="${array[*]}" -v nargs=${#array[@]} '
  BEGIN {
    print nargs;
  }
'
3

関連情報