awk命令创建单个列的sha2并将其粘贴到新文件中

时间:2018-12-13 11:26:03

标签: linux bash awk

我有一个包含多行的文件。使用该原始文件,我将再创建一个文件,但是在该新文件中,我仅占用原始文件的几列。

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

希望我很清楚。

这是我用来执行相同操作的awk命令。

Map<String, String>

输入

 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

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

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

2 个答案:

答案 0 :(得分: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==1NR>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

答案 1 :(得分:0)

使用GNU awk,您可以摆脱设置function round(value, decimals) { return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals).toFixed(decimals); } 的麻烦,尽管Ed不会喜欢它:

NF

使用awk '{ NF=5; "echo " $2" | sha256sum | cut -d\\\ -f1" | getline $(NF+1) } 1' FS='|' OFS='|' paste,您可以通过减少可移植性问题来实现相同目的:

cut