Macos awk:根据用户输入对文件进行排序

Macos awk:根据用户输入对文件进行排序,macos,bash,awk,Macos,Bash,Awk,我有一个简单的awk代码: awk-F,'BEGIN{OFS=FS}{print$2,$1,$3}'$1 很好,除了我已经硬编码了如何对明文文件中逗号分隔的字段进行排序。我希望能够在运行时指定字段排序的顺序 我认为这样做的一种方式是: read first read second read third TOTAL=$first","$second","$third awk -F, 'BEGIN{OFS=FS} {print $TOTAL}' $1 但这实际上不起作用: awk:非法字段$(

我有一个简单的
awk
代码:

awk-F,'BEGIN{OFS=FS}{print$2,$1,$3}'$1

很好,除了我已经硬编码了如何对明文文件中逗号分隔的字段进行排序。我希望能够在运行时指定字段排序的顺序

我认为这样做的一种方式是:

read first
read second
read third

TOTAL=$first","$second","$third

awk -F, 'BEGIN{OFS=FS} {print $TOTAL}' $1
但这实际上不起作用:

awk:非法字段$(),名称为“总计”

另外,我对
awk
接受用户输入的能力也有一些了解:

BEGIN {
    getline first < "-"
}

$1 == first {
}
开始{
getline优先<“-”
}
$1==第一名{
}

但我想知道创建的变量是否可以反过来用作原始打印命令中的变量?有更好的方法吗?

在调用
awk
之前,必须让
bash
展开
$TOTAL
,这样
awk
才能看到
$TOTAL
的值,而不是文本字符串
$TOTAL
。这意味着使用双引号,而不是单引号

read first
read second
read third

# Dynamically construct the awk script to run
TOTAL="\$$first,\$$second,\$$third"
SCRIPT="BEGIN{OFS=FS} {print $TOTAL}"

awk -F, "$SCRIPT" "$1"
更安全的方法是将字段号作为awk变量传递

awk -F, -v c1="$first" -v c2="$second" -v c3="$third" 'BEGIN{OFS=FS} {print $c1, $c2, $c3}' "$1"
您所需要的只是:

awk -v order='3 1 2' 'BEGIN{split(order,o)} {for (i=1;i<=NF;i++) printf "%s%s", $(o[i]), (i<NF?OFS:ORS)}'

awk-v order='3 1 2''开始{split(order,o)}{for(i=1;我忘了对其他两个变量使用
-v
。谢谢,这太棒了!
$ echo 'a b c' | awk -v order='3 1 2' 'BEGIN{split(order,o)} {for (i=1;i<=NF;i++) printf "%s%s", $(o[i]), (i<NF?OFS:ORS)}'
c a b

$ echo 'a b c' | awk -v order='2 3 1' 'BEGIN{split(order,o)} {for (i=1;i<=NF;i++) printf "%s%s", $(o[i]), (i<NF?OFS:ORS)}'
b c a