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