특정 필드를 자르고 Unix 쉘 스크립트에서 바꾸기

특정 필드를 자르고 Unix 쉘 스크립트에서 바꾸기

다음 데이터가 포함된 파일이 있습니다.

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222222222222222222222222222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888888888888888888888888888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222222222222222222222222222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555555555555555555555555555|ABCD|AB|30

|데이터는 컨트롤 A 문자로 구분되어 있지만 컨트롤 A를 사용하여 데이터를 게시할 수 없기 때문에 이를 대체했습니다 .

값을 자르고 22222222222222222222222222222처음 5개 값을 원하므로 최종 출력 데이터는 다음과 같아야 합니다.

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555|ABCD|AB|30

이에 대한 도움을 찾고 있습니다.

답변1

awk다음을 수행할 수 있습니다.

awk -F\| 'BEGIN {OFS="|"};{$12=substr($12,1,5)};1' 

-F필드 구분 기호를 로 설정한 |다음 텍스트 처리를 시작하기 전에 이 BEGIN블록을 사용하여 출력 필드 구분 기호( OFS)를 로 설정합니다. |그런 다음 각 레코드의 12번째 필드 값을 해당 필드의 처음 5자로 바꿉니다.

명령줄에서 원하는 대로 다른 인수로 처리할 파일 이름을 제공하거나, 업데이트할 파일을 생성하는 프로세스가 있는 경우 파이프에서 사용할 수 있습니다.

제가 겪었던 몇 가지 문제를 해결하고 좀 더 POSIX 스타일로 만들어준 Stéphane Chazelas에게 감사드립니다. 특히 시작 인덱스를 0에서 1로 수정합니다. GNU 문서에는 다음 줄이 포함되어 있어 이 오류가 발생하지 않습니다.

start가 1보다 작으면 substr()은 이를 1로 처리합니다.

하지만 1은 첫 번째 문자의 색인이므로 특히 그렇지 않은 사람들에게 사용해야 합니다 gawk. 예를 들어 mawk:

$ mawk 'BEGIN{print substr("1234567", 0, 5)}'
1234
$ mawk 'BEGIN{print substr("1234567", 1, 5)}'
12345

답변2

그리고 awk:

awk 'BEGIN{FS=OFS="\1"}; {$12=substr($12,1,5)}; 1' file
  • BEGIN{...}:처리가 시작되기 전에 실행
  • FS=OFS="\1": 입력 및 출력 필드 구분 기호를 로 설정합니다 ^A. ~에 따르면위키낱말사전 ^A은 "메시지 헤더의 첫 번째 문자"이고 8진수 값은 입니다 1.
  • {$12=substr($12,1,5)}: 12번째 필드를 잘라냅니다.
  • 1: 기록(기본 작동)을 인쇄합니다.

답변3

sed 's/\([^|]\{0,5\}\)[^|]*/\1/12' <in >out

...또는 GNU 또는 BSD를 사용하십시오 sed.

sed -E 's/([^|]{0,5})[^|]*/\1/12' <in >out

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555|ABCD|AB|30

매우 간단합니다. 파이프가 아닌 문자 시퀀스의 입력 행에서 가능한 12번째 발생 항목 중 최대 5개만 유지합니다.

관련 정보