在AWK中使用字符串变量打印列

在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

我试图在我的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 = 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使用类似的解决方案。