0

私の入力ファイルは次のとおりです。

B0000001201012345519680415EN
B0000001201052323219921114
B0000001701233333319510802LN
B0000001701238999919460920
B0000000247974444419611219TN
B0000000246666666619910804
B0000000247777777719940329

最初のレコード「EN」を開始9バイト()に基づいて2番目のレコードにコピーしたいと思いますB00000012。期待される出力は次のとおりです。

B0000001201012345519680415EN
B0000001201052323219921114EN
B0000001701233333319510802LN
B0000001701238999919460920LN
B0000000247974444419611219TN
B0000000246666666619910804TN
B0000000247777777719940329TN

これをUNIXシェルスクリプトで書く必要があります

4

3 に答える 3

1

Perlの使用:

perl -lape '$m = $1 if /([A-Z][A-Z])$/; s/(?<=[0-9]) *$/$m/' input

出力:

B0000001201012345519680415EN
B0000001201052323219921114EN
B0000001701233333319510802LN
B0000001701238999919460920LN
B0000000247974444419611219TN
B0000000246666666619910804TN
B0000000247777777719940329TN
于 2012-12-28T22:38:08.250 に答える
1

awk を使用する場合、これは従来のFIELDWIDTHSの使用例です。

awk -vFIELDWIDTHS="9 17 2" -vOFS="" '{if($1 in a)$3=a[$1];else a[$1]=$3}1' file
于 2012-12-29T00:46:26.993 に答える
1

これはあなたの入力で動作します:

awk '!(x = substr($0,27)) { print $0 r; next } { r = x }1' file

ただし、最初の 9 文字のチェックが必要な場合は失敗します。このチェックを実行するには、次のことを試してください。

awk 'x = substr($0,27) { a[substr($0,0,9)]=x } (y = substr($0,0,9)) in a && !x { print $0 a[y]; next }1' file

結果:

B0000001201012345519680415EN
B0000001201052323219921114EN
B0000001701233333319510802LN
B0000001701238999919460920LN
B0000000247974444419611219TN
B0000000246666666619910804TN
B0000000247777777719940329TN
于 2012-12-29T01:10:02.967 に答える