0

我有一个固定长度的文件,其中一些记录具有不同的特殊字符,例如 Еӏєпа

我可以选择那些包含特殊字符/的记录。

我想从这些记录中读取 2 列并用 '*' 填充空白来更新它

样本数据 :

1234562013-09-01 01:05:30Еӏєпа   Нцвѡі      A other    
5657812011-05-05 02:34:56abu     jaya       B other

具体来说,包含特殊字符的第 3 列和第 4 列应替换为单个“*”,并用空格填充以填充长度

我需要如下结果

1234562013-09-01 01:05:30*       *          A2013-09-01 02:03:40other    
5657812011-05-05 02:34:56abu     jaya       B2013-09-01 07:06:10other

尝试了以下命令:

sed -r "s/^(.{56}).{510}/\1$PAD/g;s/^(.{511}).{1023}/\1$PAD/g" errorline.txt  

cut -c 57-568 

有人可以帮我解决这个问题吗?

4

2 回答 2

0
sed "/.\{56\}.*[^a-zA-Z0-9 ].*.\{7\}/ s/\(.\{56\}\).\{20\}\(.\{7\}\)/\1*       *    \2/"errorline.txt

在哪里:

  • 56 是不包含特殊字符的行的第一部分
  • 20 是第二部分,可能包含特殊字符
  • 7 是最后一部分,即字符串的结尾。
  • "* * "是将替换您的特殊字符部分的字符串。

使这些值适应您的字符串结构

此 sed 读取所有文件并仅用特殊字符替换行。

于 2013-11-13T21:03:17.110 回答
0

我会去awk,比如:

awk '/[LIST__OF_SPECIAL_CHARS]/ {
       l=$0
       # for 3rd col
       # NOTE the * must be padded if you have a fixed length file
       # This can be done with spaces and/or (s)printf, read the docs 
       if (substr($0,FROM,NUM_OF_CHARS) ~ /[LIST__OF_SPECIAL_CHARS]/) {
        l=substr(l,1,START_OF_3RD_COL_MINUS_1) "*" substr(l,START_OF_4TH_COL) 
       } 
       # for 4th col
       # NOTE the * must be padded if you have a fixed length file
       # This can be done with spaces and/or (s)printf, read the docs 
       if (substr($0,START_OF_4TH_COL,NUM_OF_CHARS) ~ /[LIST__OF_SPECIAL_CHARS]/) {
        l=substr(l,1,START_OF_4TH_COL_MINUS_1) "*" substr(l,END_OF_4TH_COL_PLUS_1) 
       }
       # after printing this line, skip to next record.
       print l
       next
     }
     { # prints every other record
       print }' INPUTFILE
于 2013-11-13T13:15:05.677 回答