Shell 在unix中根据位置拆分记录,并将字符串与下一条记录进行比较并复制

Shell 在unix中根据位置拆分记录,并将字符串与下一条记录进行比较并复制,shell,unix,sed,awk,Shell,Unix,Sed,Awk,我的输入文件如下: B0000001201012345519680415EN B0000001201052323219921114 B0000001701233333319510802LN B0000001701238999919460920 B0000000247974444419611219TN B0000000246666666619910804 B0000000247777777719940329 我想根据起始9字节(B00000012)将第一条记录“EN”复制到第二条记录。 预期产出

我的输入文件如下:

B0000001201012345519680415EN
B0000001201052323219921114
B0000001701233333319510802LN
B0000001701238999919460920
B0000000247974444419611219TN
B0000000246666666619910804
B0000000247777777719940329
我想根据起始9字节(
B00000012
)将第一条记录“EN”复制到第二条记录。 预期产出为:

B0000001201012345519680415EN
B0000001201052323219921114EN
B0000001701233333319510802LN
B0000001701238999919460920LN
B0000000247974444419611219TN
B0000000246666666619910804TN
B0000000247777777719940329TN
我需要使用Perl在unix shell脚本中编写此脚本:

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

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

如果你考虑用AWK来做,这是一个经典的<强>字段宽度<强>用法示例:

awk -vFIELDWIDTHS="9 17 2" -vOFS="" '{if($1 in a)$3=a[$1];else a[$1]=$3}1' file

如果你考虑用AWK来做,这是一个经典的<强>字段宽度<强>用法示例:

awk -vFIELDWIDTHS="9 17 2" -vOFS="" '{if($1 in a)$3=a[$1];else a[$1]=$3}1' file

这将适用于您的输入:

awk '!(x = substr($0,27)) { print $0 r; next } { r = x }1' file
但是,如果需要检查前九个字符,则会失败。要执行此检查,请尝试以下操作:

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

这将适用于您的输入:

awk '!(x = substr($0,27)) { print $0 r; next } { r = x }1' file
但是,如果需要检查前九个字符,则会失败。要执行此检查,请尝试以下操作:

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

从样本数据和所需输出开始,这是一个良好的开端。但是…;-)?祝你好运。看起来你还想附加其他值。B00000017是否获得LN,B0000024是否获得TN?从样本数据和所需输出开始良好。但是…;-)?祝你好运。看起来你还想附加其他值。B00000017是否获得LN和B0000024是否获得TN?这只处理EN情况。这只是处理EN情况。这是一个有趣的(但非标准,如“不在POSIX中”)扩展-大概可以在GNU
awk
中找到(例如,它不在Mac OS X/BSD
awk
中)。是的,gawk,我忘了提到这一点。这是一个有趣的(但非标准的,如“不在POSIX中”)扩展-大概可以在GNU
awk
(例如,它不在Mac OS X/BSD
awk
)中找到。是的,gawk,我忘了提到这一点。。