我有这个简单的awk
代码:
awk -F, 'BEGIN{OFS=FS} {print $2,$1,$3}' $1
效果很好,除了我已经硬编码我想要如何排序我的纯文本文件的逗号分隔字段。我希望能够在运行时指定我想要对字段进行排序的顺序。
我想到这样做的一个hacky方式就是:
read first
read second
read third
TOTAL=$first","$second","$third
awk -F, 'BEGIN{OFS=FS} {print $TOTAL}' $1
但这实际上并不奏效:
awk: illegal field $(), name "TOTAL"
另外,我对awk
接受用户输入的能力有所了解:
BEGIN {
getline first < "-"
}
$1 == first {
}
但是我想知道创建的变量是否可以在原始打印命令中用作变量?还有更好的方法吗?
答案 0 :(得分:3)
在调用bash
之前,您必须让$TOTAL
展开awk
,以便awk
看到$TOTAL
的值,而不是文字字符串{{ 1}}。这意味着使用双引号,而不是单引号。
$TOTAL
更安全的方法是将字段编号作为awk变量传递。
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"
答案 1 :(得分:0)
您只需要:
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)}'
e.g:
$ 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