Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash一行以屏蔽文件中的数据_Regex_Awk_Sed_Grep - Fatal编程技术网

Regex Bash一行以屏蔽文件中的数据

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 在上面的

我有一个中等大小的(~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
在上面的示例数据中,
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;iSo
begin
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