awk:根据用户输入排序文件

时间:2016-03-31 17:44:54

标签: macos bash awk

我有这个简单的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 {
}

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

2 个答案:

答案 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
相关问题