目的は、カンマの前のすべての行に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
メモ:
12345
になり000012345
、12
につながるはずです000000012
。つまり、カンマの前の数字の順序に焦点を当てます。- 行の形式は常にです
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