カンマの前のすべての行に 9 文字が含まれるまで前にゼロを追加し、sed を使用して 3 桁ごとに 1 文字を挿入します。

カンマの前のすべての行に 9 文字が含まれるまで前にゼロを追加し、sed を使用して 3 桁ごとに 1 文字を挿入します。

目的は、カンマの前のすべての行に9文字が含まれるまで前に0を追加してから、3番目の数字ごとに文字を挿入することですsed

入力する

12345,1s4c3v6s3nh6
123456789,9h5vgbdx34dc
12,7h4f45dcvbgh
1234567,09klijnmh563

現在の結果

[vagrant@localhost ~]$ sed -e 's/\([0-9]\{3\}\),/\/\1\//g' file
12/345/1s4c3v6s3nh6
123456/789/9h5vgbdx34dc
12,7h4f45dcvbgh
1234/567/09klijnmh563

予想される結果

000/012/345,1s4c3v6s3nh6
123/456/789,9h5vgbdx34dc
000/000/012,7h4f45dcvbgh
001/234/567,09klijnmh563

メモ:

  1. 12345になり00001234512につながるはずです 000000012。つまり、カンマの前の数字の順序に焦点を当てます。
  2. 行の形式は常にです MAX_9_characters,fixed_12_characters。つまり、 1234512345,1s4c3v6s3nh6入力ファイルには存在しません。

問題は、sedを使用して文字数を等しくすることができないことです。これがどのように可能ですか?

ベストアンサー1

入力の2番目のフィールドに長いシーケンス番号がない場合は、以下を試してください。

$ sed -e 's|^[^,]*|#000000000&|;s|#[^,]*\(.\{9\}\),|\1,|;s|\([0-9]\{3\}\)|\1/|g;s|/\([^0-9]\)|\1|;s|/$||' file
000/012/345,1s4c3v6s3nh6
123/456/789,9h5vgbdx34dc
000/000/012,7h4f45dcvbgh
001/234/567,09klijnmh563

説明する

  • s|^[^,]*|#000000000&|:私たちは最初から最初まですべてを一致させ、,それを製造元とn個の数字0に置き換えます#。ここで、nは私たちが満たすべき長さです。

  • s|#[^,]*\(.\{9\}\),|\1,|:トークンから最初のものまですべてを一致させ、,その前の最後の9文字だけを保持し、残りは,捨てます。

  • s|\([0-9]\{3\}\)|\1/|g/3桁ずつ順に追加します。

  • s|/\([^0-9]\)|\1|;s|/$||:after が/数値でない場合、または/行末にある場合は削除します。

または使いやすいですperl

$ perl -F',' -anle '
    $F[0] = sprintf "%09s", $F[0];
    $F[0] =~ s|.{3}|$&/|g;
    chop $F[0];
    print join ",",@F;
' file
000/012/345,1s4c3v6s3nh6
123/456/789,9h5vgbdx34dc
000/000/012,7h4f45dcvbgh
001/234/567,09klijnmh563

おすすめ記事