파일의 특정 열에서 주어진 조건을 사용하여 필드에 값을 추가합니다.

파일의 특정 열에서 주어진 조건을 사용하여 필드에 값을 추가합니다.

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

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에게 감사드립니다. ^.*?\|두 번째 열과 일치하는 것이 보장되지 않습니다. 예를 들어 ab|asd|10017516|asd잘못 변경됩니다.

관련 정보