在文件特定列中的给定条件的字段中添加值

在文件特定列中的给定条件的字段中添加值

9当第二列的值以以下开头10且第二列的长度为8 示例时,我需要在文件的第二列中添加前缀数字

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

使用perlGNU的解决方案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如果不需要备份

编辑:

感谢 @drg 指出 perl one-liner 中的错误..^.*?\|不能确保匹配第二列.. 例如,ab|asd|10017516|asd会被错误地更改

相关内容