Shell-Script

在文件特定列中的給定條件的欄位中添加值

  • August 19, 2016

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

使用perl和 GNU的解決方案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會被錯誤地更改

以下應該有效(我希望不需要解釋)

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

引用自:https://unix.stackexchange.com/questions/304331