我有一个包含多行的文件。使用该原始文件,我将再创建一个文件,但是在该新文件中,我仅占用原始文件的几列。
我要做的是,不仅要选择几列并粘贴到新文件中,还需要创建第一列的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
答案 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==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
答案 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