Regex Bash一行以屏蔽文件中的数据
我有一个中等大小的(~2000行),如果记录字符和记录类型匹配,我想在其中屏蔽数据 文件名:test.txt 我根据上面的链接编写了一个示例脚本,并给出了下面的命令Regex Bash一行以屏蔽文件中的数据,regex,awk,sed,grep,Regex,Awk,Sed,Grep,我有一个中等大小的(~2000行),如果记录字符和记录类型匹配,我想在其中屏蔽数据 文件名:test.txt 我根据上面的链接编写了一个示例脚本,并给出了下面的命令 awk 'BEGIN{FS=OFS="\"\""} ($1$2$3==$recordchar && $12$13==$recordtype) { for(i=$begin;i<=$end;i++) $i="X"}1' $file_name 在上面的
awk 'BEGIN{FS=OFS="\"\""} ($1$2$3==$recordchar && $12$13==$recordtype) {
for(i=$begin;i<=$end;i++) $i="X"}1' $file_name
在上面的示例数据中,recordchar=SAR
和recordtype=56
其中begin=1
和end=5
运行脚本后,希望将数据视为
SAR000000005600000000000000000000XXXXX
在sed中,我可以看到它检查第一个字符,但不确定如何检查第二个记录类型。。在此方面的任何帮助都将不胜感激
关于上述文件的其他信息
- 前三个字母总是字符
- 56号在固定位置
- 整个文件的长度各不相同。。从10到136 字符到掩码的位置也不同
recordchar
,recordtype
,开始和结束
awk 'BEGIN{FS=OFS="\"\""} ($1$2$3==$recordchar && $12$13==$recordtype) {
for(i=$begin;i<=$end;i++) $i="X"}1' $file_name
这里的
SAR
是记录,65
是记录类型,要屏蔽的字符是A到N这里有一个使用所有预定义变量的替代awk
:
cat mask.awk
substr($0,1,3) == recordchar && substr($0,12,2) == recordtype {
p = substr($0, 1, begin-1) # substring before begin position
c = substr($0, begin, end-begin+1) # substring between begin and end positions
s = substr($0, end + 1) # substring after end position
gsub(/./, "X", c) # replace each char by X between begin, end
$0 = p c s # concat all parts
} 1
运行它:
awk -v recordchar='SAR' -v recordtype='56' -v begin=34 -v end=38 -f mask.awk file
SAR000000005600000000000000000000XXXXX
SAR00000099652009110000060063803721586 3LOBO ABCDEF/GHIJKLMN 05AUG98ADT
再说一遍:
awk -v recordchar='SAR' -v recordtype='65' -v begin=46 -v end=60 -f mask.awk file
SAR00000000560000000000000000000012345
SAR00000099652009110000060063803721586 3LOBO XXXXXXXXXXXXXXX 05AUG98ADT
您的样本现在已更改且不清晰(编辑后),请您清楚地添加它们,将您的实际输入文件样本和预期样本清楚地放置,以便更好地理解。什么是
begin
和end
值?每个记录中都有这些绝对字符位置吗?样本数据的预期输出是什么:2?请花些时间编辑您的问题中的输入和预期输出样本,以使其清楚,谢谢。我不确定我的样本中有什么不清楚。。我提到了2个示例,以及我正在尝试做的事情和到目前为止我已经尝试过的事情。Recordchar是静态SAR(始终为前3位),65是静态的,始终为13位和14位。。我有开始和结束的记录,我想掩盖(X)。。所以X需要从头到尾重复。。如果有什么不清楚的地方,请告诉我。再次感谢你的帮助。!谢谢你的帮助。。awk似乎运行时没有语法错误,但它似乎在从行的末尾开始计算,并从字符串的末尾到后面进行屏蔽。。在这种情况下,如果可能的话,我想从理想的开始到理想的结束。。就像在我的命令里,我有去哪里和去哪里结束。。“{为了(i=$begin;iSobegin
和end
是像begin=34
和end=38
这样的绝对位置,在这条记录中SAR00000000560000000000000012345
?谢谢。它似乎在工作。将检查一些其他场景。一个简单的问题-有没有办法在我的脚本中添加这一行nction?而不是保存mask.awk?是的,您可以使用:awk-v recordchar='SAR'-v recordtype='65'-v begin=46-v end=60'substr($0,1,3)==recordchar&&substr($0,12,2)==recordtype{p=substr($0,1,begin 1);c=substr($0,begin,end+1);s=substr($0,end+1);gsub(/./,“X”,c);$0=pcs;}1'文件
是的,我在上面尝试过,它在脚本中内联工作。。
awk -v recordchar='SAR' -v recordtype='56' -v begin=34 -v end=38 -f mask.awk file
SAR000000005600000000000000000000XXXXX
SAR00000099652009110000060063803721586 3LOBO ABCDEF/GHIJKLMN 05AUG98ADT
awk -v recordchar='SAR' -v recordtype='65' -v begin=46 -v end=60 -f mask.awk file
SAR00000000560000000000000000000012345
SAR00000099652009110000060063803721586 3LOBO XXXXXXXXXXXXXXX 05AUG98ADT