在AWK中使用字符串变量打印列
我试图在我的AWK(或GAWK)程序中使用一个变量来打印多列 我从命令行获取要打印的列:在AWK中使用字符串变量打印列,awk,gawk,Awk,Gawk,我试图在我的AWK(或GAWK)程序中使用一个变量来打印多列 我从命令行获取要打印的列: gawk -v cols=1,2,3 -f sample.awk -F, 我希望能够在我的BEGIN{}块中设置这个变量,并在程序的主要部分使用它 BEGIN{ split(cols, col_arr, FS) i=1; col_str = "$"col_arr[1]; for(col in col_arr){ if (i > 1){ col_str = co
gawk -v cols=1,2,3 -f sample.awk -F,
我希望能够在我的BEGIN{}
块中设置这个变量,并在程序的主要部分使用它
BEGIN{
split(cols, col_arr, FS)
i=1;
col_str = "$"col_arr[1];
for(col in col_arr){
if (i > 1){
col_str = col_str",$"col;
}
i++;
}
}
{
print col_str
}
但是,这将只打印“$1、$2、$3”。如何将其更改为打印列1、2和3?
在读取第一条输入记录之前,开始规则只执行一次。
试试这样的
awk '{cols = $1 OFS $2 OFS $5; print cols}' file
BEGIN{
sub(/,$/,"",cols)
n=split(cols,C,/,/)
}
function _get_cols(i,s){
for(i=1;i<=n;i++) s = length(s) ? s OFS $(C[i]) : $(C[i])
return s
}
{
print _get_cols()
}
更新
要么像Jonathan Leffler那样生成脚本,因为与shell(和PERL)不同,AWK不计算字符串中的变量,要么像这样
awk '{cols = $1 OFS $2 OFS $5; print cols}' file
BEGIN{
sub(/,$/,"",cols)
n=split(cols,C,/,/)
}
function _get_cols(i,s){
for(i=1;i<=n;i++) s = length(s) ? s OFS $(C[i]) : $(C[i])
return s
}
{
print _get_cols()
}
或者像这样的东西你必须试试
#!/bin/bash
# Usage : _parse <FS> <OFS> 1 2 3 ... n < file
_parse()
{
local fs="$1"
local ofs="$2"
shift 2
local _s=
local f
for f; do
_s="${_s}\$${f},"
done
awk -F"$fs" -v OFS="$ofs" "{ print ${_s%,} }"
}
# Call function
_parse ' ' '\t' 1 3 < infile
#/bin/bash
#用法:_解析1 2 3。。。n<文件
_parse()
{
本地fs=“$1”
本地ofs=“$2”
班次2
本地=
局部f
为f;do
_s=“${u s}\${f},”
完成
awk-F“$fs”-v OFS=“$OFS”“{print${us%,}”
}
#调用函数
_分析“”\t“13
您最好使用一个程序(可能是awk
)来编写最终运行的awk
脚本
例如:
trap "rm -f script.awk; exit 1" 0 1 2 3 13 15
awk '{ printf "{ print ";
pad = ""; for (i = 1; i <= NF; i++) { printf "%s$%d", pad, $i; pad = ", " }
print " }"
}' <<< "1 2 5" > script.awk
awk -f script.awk data.file
rm -f script.awk
trap 0
trap“rm-f script.awk;退出1”0 1 2 3 13 15
awk'{printf'{print”;
pad=“”;用于(i=1;如果在BEGIN块中执行此操作,它将不起作用。实际上,我将从一个数组中获取要打印的列,并希望定义要打印的值一次,而不是在包含要打印的列号的数组中不断循环。我只是试图使示例保持简单。感谢示例。我可能会d使用类似的解决方案。