【问题标题】:awk command to create sha2 of individual column and paste into new fileawk 命令创建单个列的 sha2 并粘贴到新文件中
【发布时间】:2018-12-14 15:02:05
【问题描述】:

我有一个包含多行的文件。使用该原始文件,我正在创建一个更多文件,但在该新文件中,我只占用原始文件的几列。

我要做的是,我需要创建第一列的 sha2 并将新文件作为普通值和 sha2 值粘贴到新文件中,而不是只选择几列并粘贴到新文件中。

希望我清楚。

这是我用来做同样事情的 awk 命令。

 awk -F '|' -v  OFS='|' -v  var="10|" '(NR - 1) != 0  {$2=var$2; print $2,$3,$4,$5} (NR - 1) == 0   {print} ' $line > $subName$i$output

输入

2|0001001010000026316|531849|1150|101|01111991|00919323739251      |VIJAYPANDEY1191@GMAIL.COM                                   |VIJAY PANDEY                            |PART OF GROUND FLOOR & BASEMENT         |SHOPPER STOP SV ROAD ANDHERI WEST       |LANDMARK-ERSTWHILE CRASSWORD BOOK STORE |MUMBAI                        |400058

预期输出需要第二列的 SHA2 值并作为同一行的最后一列追加

10|0001001010000026316|531849|1150|101|2e16abd9f3e3e368210b11faa5bfebdb6e001034b58cc9ad1c689dfd1f7eeacd

【问题讨论】:

  • 您能否在您的帖子中发布输入样本和预期输出样本,然后让我们知道。
  • @RavinderSingh13 检查我的编辑
  • 对不起,我没听懂,请提及您获得预期输出的逻辑。
  • @RavinderSingh13 再次编辑。我想生成第二列的 sha2 值并将其附加到同一行的最后一列

标签: linux bash awk


【解决方案1】:

试试这个:

awk -F"|" -v var="10" '
    NR==1;
    NR>1{
        "echo "$2"|sha256sum" | getline shaoutput; 
        split(shaoutput, sha, " "); 
        print var, $2, $3, $4, $5, sha[1]
    }' OFS="|" file

输出:

10|0001001010000026316|531849|1150|101|2e16abd9f3e3e368210b11faa5bfebdb6e001034b58cc9ad1c689dfd1f7eeacd

我更喜欢使用NR==1 和NR>1,因为它更具可读性。

NR==1;可以,不用加{print}

对于NR>1,我使用sha256sum 来生成sha,因为awk 没有任何功能可以做到这一点(据我所知)。我将输出保存在shaoutput 变量中,使用split 清理输出,然后打印需要的内容。

我不希望将输出分隔符存储在 var 变量中。 在 print 中使用逗号将使 awk 使用 OFS 变量作为分隔符。

已编辑

正如 Ed Morton 所建议的,一种改进的解决方案:

awk -v var="10" '
    BEGIN{
        FS=OFS="|"
    }
    NR==1;
    NR>1{
        shaoutput="";
        cmd="echo \047" $2 "\047 | sha256sum" ;
        if ( (cmd | getline line) > 0 ){
            shaoutput=line
            close(cmd)
        }
        split(shaoutput, sha, " ");
        print var, $2, $3, $4, $5, sha[1];
    }' file

【讨论】:

  • 感谢@EdMorton,我总是学习新事物并与您的 cmets 一起改进。我很感激。已编辑
  • SHA256 命令是否应该在输入的末尾不接收换行符?
【解决方案2】:

使用 GNU awk,您可以设置 NF,尽管 Ed 不会喜欢它:

awk '{ NF=5; "echo " $2" | sha256sum | cut -d\\\  -f1" | getline $(NF+1) } 1' FS='|' OFS='|'

paste 和 cut 的可移植性问题更少,您也可以做到这一点:

paste -d'|' <(cut -d'|' -f1-5 infile) <(cut -d'|' -f2 infile | sha256sum | cut -d' ' -f1)

【讨论】:

  • 出色的预测 - 我不喜欢它:-)。使用 getline 可能会以各种阴险的方式失败,您没有引用传递给 echo 的值,这会由于通配等原因引入漏洞和错误,即使/当它起作用时,它也只会在某些 awks 中这样做由于将 NF 设置为较小值的不可移植/未定义行为,因此让 shell 调用 awk 调用 shell 调用 shell 命令管道与直接从 shell 调用该命令管道相比毫无意义。
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多