다음 데이터가 포함된 파일이 있습니다.
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개만 유지합니다.