首页 > 解决方案 > 有没有办法在 Shell 中使用 base64 对 csv 中的多个列进行编码?

问题描述

我需要用它的 base64 编码值替换 csv 文件的多个列,该值应该应用于文件的某些列,但第一行不受影响,因为第一行包含文件的标题。我已经尝试了如下的 1 列,但是因为我在跳过文件的第一行后让它继续,所以它不是

gawk 'BEGIN { FS="|"; OFS="|" } NR >=2 { cmd="echo  "$4" | base64 -w 0";cmd | getline x;close(cmd); print $1,$2,$3,x}' awktest             

o/p:

12|A|B|Qw==         
13|C|D|RQ==  
36|Z|V|VQ==   

问:它没有在输出中显示标题。我应该怎么做才能在输出中生成标题?我也可以在这里使用任何循环来替换多列吗?

输入:

10|A|B|C|5|T|R                                     
12|A|B|C|6|eee|ff                        
13|C|D|E|9|dr|xrdd                       
36|Z|V|U|7|xc|xd                                

所需输出:

10|A|B|C|5|T|R                          
12|A|B|encodedvalue|6|encodedvalue|ff                                  
13|C|D|encodedvalue|9|encodedvalue|xrdd                               
36|Z|V|encodedvalue|7|encodedvalue|xd                         

这可能吗?研究了很多,但找不到合适的解释。我是壳牌新手。请帮忙。非常感谢!!!!

标签: encodingbase64

解决方案


看起来你可以只对条件进行排序。这可能不是解决标题问题的最佳方法,但它很直观。

BEGIN { FS="|"; OFS="|" } NR ==1 {print} NR >=2 { cmd="echo  "$4" | base64 -w 0";cmd | getline x;close(cmd); print $1,$2,$3,x}

至于使用循环来影响多列...... bash 中的循环很难。awk 在技术上是它自己的语言,并且可能有它自己的循环结构,IDK。但不清楚你是否需要一个循环。如果只有合理数量的字段需要修改,您可以通过字段索引(以某种方式)参数化现有命令,然后通过管道传递它的许多实例。它不会像在一次 awk 中完成所有操作那样高效,但这可能没关系。


推荐阅读