AWK如何初始化具有多个字段的变量进行打印

1 shell awk field options

我正在编写一个SHELL脚本,它将根据用户从.sh脚本中指定的选项调用AWK脚本文件打印特定字段

EXAMPLE

-N=field with a list of Names               ==> is the filed number 2
-A=field with a list of Addresses           ==> is the filed number 4
-P=field with a list of Prices              ==> is the field number 6
-D=field with a list of Dates               ==> is the field number 10


./SHELLSCRIPT.sh -N -A -P -D

NAMES,ADDRESSES,PRICES,DATES
NAMES,ADDRESSES,PRICES,DATES
NAMES,ADDRESSES,PRICES,DATES
Run Code Online (Sandbox Code Playgroud)

./SHELLSCRIPT.sh -N -D

NAMES,DATES
NAMES,DATES
NAMES,DATES
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用-v选项初始化AWK中的变量,传递字段数但我在打印时遇到一些困难......

这是AWK脚本:

#!/usr/bin/awk -f
BEGIN {
        FS="\",\"" ;
        -v test=2,4,6,10
        for (i in test)
        print $test[i];
        }
Run Code Online (Sandbox Code Playgroud)

当用户未在shell脚本中指定某些选项时,AWK脚本必须排除某些字段

在此先感谢您的关注和支持.

Ed *_*ton 5

-v是一个awk ARGUMENT,而不是语言结构.这是你在awk命令行中指定的东西,比如-F.Nevere使用shebang从脚本调用awk,因为它只是从可用的功能中消失.而不是你拥有的:

#!/usr/bin/awk -f
BEGIN {...}
Run Code Online (Sandbox Code Playgroud)

你这样做:

/usr/bin/awk '
BEGIN {...}
' "$@"
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要使用awk args,访问shell位置参数,导出变量等,例如:

/usr/bin/awk -v test='2,4,6,10' '
BEGIN {...}
' "$@"
Run Code Online (Sandbox Code Playgroud)

现在,为了解决你写的实际问题:

/usr/bin/awk -F'"," -v test='2,4,6,10' '
BEGIN {
    split(test,array1,/,/)
    for (i in array1)
        array2[array1[i]]
}
{
    print "array1:"
    for (i=1; i in array1; i++) {
        print i, $(array1[i])
    }
    print "array2:"
    for (i in array2) {
        print i, $i
    }
}
' "$@"
Run Code Online (Sandbox Code Playgroud)

array1将是您在关注字段输出顺序时使用的内容,array2将在您不关心顺序时使用.