ファイルの特定の列で指定された条件を使用してフィールドに値を追加します。

ファイルの特定の列で指定された条件を使用してフィールドに値を追加します。

92番目の列の値が次から始まり10、2番目の列の長さが次の場合、8 ファイルの2番目の列にプレフィックス番号を追加する必要があります。

file.txt

T01|10017516|01|ABCD|1203|EFGH   
T01|10905704|01|ABCD|1203|EFGH           
T01|550007656|02|ABCD|1203|EFGH     
T01|550007657|01|ABCD|1203|EFGH      
T01|10190570|01|ABCD|1203|EFGH                             
T01|950007659|01|ABCD|1203|EFGH           
T01|950007657|01|ABCD|1203|EFGH           
T01|10473696|01|ABCD|1203|EFGH  
T01|850007651|01|ABCD|1203|EFGH

結果は次のとおりです。

T01|910017516|01|ABCD|1203|EFGH  
T01|910905704|01|ABCD|1203|EFGH  
T01|550007656|02|ABCD|1203|EFGH  
T01|550007657|01|ABCD|1203|EFGH  
T01|910190570|01|ABCD|1203|EFGH  
T01|950007659|01|ABCD|1203|EFGH  
T01|950007657|01|ABCD|1203|EFGH   
T01|910473696|01|ABCD|1203|EFGH  
T01|850007651|01|ABCD|1203|EFGH

答え1

これはうまくいきます(説明が必要ないことを願っています)。

awk -F'|' -vOFS='|' '$2 ~ /^10/ && length($2) == 8{$2="9"$2}; {print}' file.txt

答え2

GNUを利用したperlソリューションsed

perl -pe 's/^[^|]*\|\K(10\d{6}\|)/9$1/' file.txt

sed -r 's/^([^|]*\|)(10[0-9]{6}\|)/\19\2/' file.txt

どちらの場合も、-i.bkpファイルを変更して元のファイルをコピーするか、file.txt.bkpバックアップ-iが必要ない場合は追加できます。

編集する:

Perl one-linerのバグを指摘した@drgに感謝します。^.*?\|2番目の列と一致することは保証されません。たとえば、誤ってab|asd|10017516|asd変更されます。

関連情報