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

私は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 に答える
0
sed "/.\{56\}.*[^a-zA-Z0-9 ].*.\{7\}/ s/\(.\{56\}\).\{20\}\(.\{7\}\)/\1*       *    \2/"errorline.txt

どこ:

  • 56 は、特殊文字を含まない行の最初の部分です
  • 20 は、おそらく特殊文字を含む 2 番目の部分です。
  • 7 は文字列の最後の部分です。
  • "* * "特殊文字セクションを置き換える文字列です。

これらの値を文字列構造に適合させます

この sed はすべてのファイルを読み取り、行のみを特殊文字に置き換えます。

于 2013-11-13T21:03:17.110 に答える