捕获特定列并屏蔽列

时间:2014-03-25 02:56:53

标签: shell unix nawk

我正在尝试编写脚本以捕获并屏蔽特定列。我需要使用明文的4列并在输出文件中也屏蔽它。我不知道如何屏蔽同一列

请帮我改写下面的命令或新命令

input.txt
---------
AA | BB | CC | 123456

output.txt
---------
BB | 123456 | 12xx56

我写的脚本

cat input.txt | nawk -F '|' '{print $2  "|" $4 "|" $4} >output.txt

1 个答案:

答案 0 :(得分:0)

nawk -F '|' '{print $2  "|" $4 "|" substr($4, 1,3) "xx" substr($4,6,2)}' input.txt > output.txt

<强>输出

BB | 123456| 12xx56

假设你真的不需要前导空格和尾随空格,我会把它变成

nawk -F '|' '{gsub(/  */, "", $0);print $2  "|" $4 "|" substr($4, 1,2) "xx" substr($4,5,2)}' input.txt > output.txt

cat output.txt
BB|123456|12xx56

最终解决方案

echo "AA | BB | CC | 12345678" \
| awk -F '|' '{gsub(/  */, "", $0)
  #dbg print "length$4=" (length($4)-4)
  masking=sprintf("%"(length($4)-4)"s", " ") ; gsub(/ /, "x", masking)
  print $2  "|" $4 "|" substr($4, 1,2) masking substr($4,(length($4)-1),2)
}'

BB|12345678|12xxxx78

我使用echo "..."来简化测试过程。您可以将其取出,替换为input.txt > output.txt和行尾,它将像以前一样工作。

我添加了(length($4)-1),根据$ 4中单词的长度,以$ 4为动态,将第二个到最后一个char的位置设置为动态。

IHTH