고정 길이 파일의 특정 위치에 있는 특정 줄의 문자열 바꾸기

고정 길이 파일의 특정 위치에 있는 특정 줄의 문자열 바꾸기

레코드에 태그가 지정된 고정 길이 데이터 파일이 있고(처음 6개 문자에는 레코드를 식별하는 특정 문자열이 있음) 특정 줄과 해당 줄의 특정 위치에 있는 텍스트를 바꿔야 합니다.

HEADER   123456
SHIPTO   CODE    123 LANE     HOUSTON    TX
ITEM     ACME BRICK

예를 들어 위 데이터의 배송지 주소 코드를 바꾸고 싶습니다. 데이터는 배송 기록의 위치 10-17("SHIPTO"로 시작하는 줄)에서 찾을 수 있습니다. sed 또는 awk(또는 다른 명령)를 사용하고 싶지만 단일 명령줄을 사용하여 데이터를 업데이트하고 싶습니다. SHIPTO 라인이 여러 개인 경우 모두 업데이트할 수 있습니다.

답변1

sed를 사용하세요:

$ sed -E '/^SHIPTO/ s/(.{9}).{8}/\1NuValue /' file
HEADER   123456
SHIPTO   NuValue 123 LANE     HOUSTON    TX
ITEM     ACME BRICK

작동 방식:

  • /^SHIPTO/

    그러면 다음으로 시작하는 줄이 선택됩니다 SHIPTO. 이것바꾸다다음 명령은 이러한 줄에만 적용됩니다.

  • s/(.{9}).{8}/\1NuValue /

    이는 줄의 처음 9+8자를 일치시키고 줄의 처음 9자를 그룹 1에 저장합니다. 이러한 문자는 그룹 1 \1과 새 값(서식을 유지하려면 8자여야 함) 으로 대체됩니다 .

답변2

주어진 입력 파일:

HEADER   123456
SHIPTO   CODE    123 LANE     HOUSTON    TX
ITEM     ACME BRICK

첫 번째 필드가 "SHIPTO"인 "Code" 뒤의 필드를 변경하려고 합니다.

$ awk 'BEGIN { OFS = "\t" } $1 != "SHIPTO" { print } $1 == "SHIPTO" { $3="0000"; print }' input
HEADER   123456
SHIPTO  CODE    0000    LANE    HOUSTON TX
ITEM     ACME BRICK

필드가 고정 길이이고 공백으로 구분되어 있고 탭으로 구분되지 않은 경우 형식이 지정된 인쇄 문자열(예: printf( "%20s\t" "$1" ))을 사용할 수 있습니다.

관련 정보