脚本将把csv文件头位置A、C、B、D转换为A、B、C、D,输出变量VAR_INP将在awk中用于打印和创建新的csv文件。
VAR_INP="TMP1=$1 ; TMP2=$2 ; TMP3=$3 ; TMP4=$4 ; $1=TMP1 ;$3=TMP2 ;$2=TMP3 ;$4=TMP4 ;"
我需要在awk中使用这个VAR_INP作为输入命令。
echo "A,C,B,D" > input.csv
awk 'BEGIN { FS=OFS","}
{
$VAR_INP
print
}' input.csv
预期输出
A,B,C,D
我没有得到预期的结果。它按原样打印输入。
只有当我展开VAR_INP并手动运行时,它才起作用
请告知。
3条答案
按热度按时间laik7k3q1#
在下面的命令输出中,前缀为
-|
。有几个问题:VAR_INP
,您应该使用单引号,而不是双引号。否则$...
会被shell展开,你的变量不再包含你想要的内容。演示:1.要将shell变量嵌入到
awk
脚本中,不能使用单引号,因为单引号会阻止扩展。您可以对awk
脚本使用双引号,这样$VAR_INP
在awk
运行之前由shell展开,但这将非常烦人,因为您必须转义所有其他$
。使用awk
的-v
选项来分配一个awk
变量,并在awk
脚本中仅使用其名称引用其值(无$
):1.正如你在前面的例子中看到的,你不能像这样在变量中嵌入
awk
代码,awk
没有bash
eval
的等价物,你不能要求awk
像执行awk
代码一样执行VAR_INP
变量中的字符串。最接近的可能是system
函数,但是从awk
调用awk
对于解决您的问题来说是无用的复杂。相反,您可以传递一个带有数字列表的变量,这些数字表示输出中输入字段编号的有序列表。
下面的例子应该可以与任何POSIX
awk
一起使用,它已经在GNUawk
和macOS附带的awk
上进行了测试:将输入和输出字段分隔符降为
,
。将输出顺序作为变量order
传递。在输入字段分隔符上的BEGIN
splitorder
中,将结果存储在数组a
中,并将元素数存储在n
中。然后对于每个记录,从i=1
循环到i=n
并打印字段号a[i]
,如果是i<n
,则输出字段分隔符(OFS
),否则输出记录分隔符(ORS
)。如果您有许多列,但只想更改其中的几个,则只列出更改可能更容易。下面的
from
是要更改的字段列表,to
是相应的字段编号列表。这里,输出场2、3、12和17分别被输入场17、2、3和12代替。其余46个字段保持不变。或者,如果您愿意,可以将每对变换写入一个变量:
csga3l582#
你可以让变量成为awk脚本的一部分,例如:
input.csv
包含A,C,B,D
时的输出:puruo6ea3#
跳过所有循环,只使用动态生成的硬编码字段:
你可以用你喜欢的任何数量的字段来做,包括巨大的字段: