csv AWK -将字符串数组作为变量传递,以便从TSV文件中打印列

p1tboqfb  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(112)

我已经将列号作为字符串数组存储在一个单独的变量中,我想在AWK打印中提供该变量作为输入。
所以,我想创建一个变量,存储$1,$2,$3,$4,$5,并将其作为输入传递。
第一部分,创建一个变量,我已经成功地与这段代码:

clm=$(
     awk -F"\t" '{print NF}' broj.tsv |
     sort -nu |               
     tail -n 1) && 
     comma_arr=$(seq -s, 1 $clm | 
     sed 's/^/\$/; s/,$//; s/,/,$/g')

运行&& echo "$comma_arr"之后,我可以看到所需的输出,即**$1、$2、$3、$4、$5**。
下一步是将comma_arr作为AWK打印的输入。
我试过的是:

&& awk -v c=$comma_arr '{print c}' broj.tsv

但这会返回与输出相同的字符串数组:$1,$2,$3,$4,$5.
我正在寻找最简单的方法来做到这一点,但我没有成功。如果你能解释我如何实现这一点,这里有什么问题(我知道,通过传递“c”awk识别这是一个字符串要打印,而不是列顺序)。

5lwkijsr

5lwkijsr1#

只需要将列号放在变量中,前面不放$,然后将其拆分并迭代以获得您想要的结果。

comma_arr=1,2,3,4,5
awk -v "c=$comma_arr" '
    BEGIN {split(c, cols, ",")} 
    {for (i in cols) printf("%s ", $cols[i]); 
     print ""
}'
sirbozc5

sirbozc52#

样本数据集:

$ cat sample.dat
1 2 3 4 5 6 7
a b c d e f g

指定要打印的列列表的一种awk方法:

for list in '1,2,3,4' '4,1,6,2,3' '1,1,1,1'
do
    echo "######## list = $list"

    awk -v list="${list}" '
    BEGIN { n=split(list,cols,",") }
          { for (i=1;i<=n;i++)
                printf "%s%s", (i==1 ? "" : OFS), $(cols[i])
            print ""
          }
    ' sample.dat
done

这产生:

######## list = 1,2,3,4
1 2 3 4
a b c d
######## list = 4,1,6,2,3
4 1 6 2 3
d a f b c
######## list = 1,1,1,1
1 1 1 1
a a a a

相关问题