Informatica에서 변환되어 Teradata 테이블에 저장된 일반 텍스트 파일을 사용합니다. 파일에는 14개의 필드(~ 구분)가 포함되어 있습니다. 그러나 레코드가 여러 줄에 분산되어 있으므로 Informatica는 해당 레코드를 선택할 수 없습니다.
sed/awk 또는 다른 명령을 사용하여 구분 기호를 계산하여 레코드를 연결하는 방법이 있습니까?
샘플 기록---
48602040112~4100010080701242015~2010-01-21 10:23:44~Foods~7~Poultry ~Perdue Smart Chicken~Circular~06
-JAN-10~24-JAN-10~$5.99~24 oz., select varieties
up to 4 at this price, additional
Save up to $4.00
load up on savings~~1598
이상적으로는 다음과 같아야 합니다.
48602040112~4100010080701242015~2010-01-21 10:23:44~Foods~7~Poultry ~ Perdue Smart Chicken~Circular~06-JAN-10~24-JAN-10~$5.99~24 oz., select varieties up to 4 at this price, additional Save up to $4.00 load up on savings~~1598
명확하지 않은 경우 개행 문자가 포함되어 있습니다.
답변1
tr -d \\n <infile | tr \~ \\n | paste -d~ - - - - - - - - - - - - - -
작동합니다.
답변2
다음을 사용해 볼 수 있습니다 sed
.
sed -rn ':a;/^([^~]*~){13}[^~]*$/!{N;s/\n//;ba};p' yourfile.tsv
그것이 무엇을 할 수 있는지
스크립트는 다음으로 구분된 세 부분으로 구성됩니다 ;
.
:a
분기할 수 있는 태그 정의/^([^~]*~){13}[^~]*$/!{N;s/\n//;ba}
검색 완료 열/^([^~]*~){13}[^~]*$/
13개 항목으로 구분된 정확히 14개의 필드( 이외의 항목이 0개 이상 발생~
) 를 포함하는 행을 찾습니다~
.!
검색 결과 반전(찾지 못하면...){N;s/\n//;ba}
열이 불완전한 경우 실행 차단N
다른 줄을 읽어보세요s/\n//
두 줄 사이의 개행 제거ba
이전에 정의한 라벨(a)에 대한 분기(b)
p
전체 열 인쇄
답변3
공백이 있거나 없는 분할 필드를 포함할지 여부를 결정하는 방법이 명확하지 않습니다. 06<NL>-JAN-10
줄 바꿈을 제거하고 varieties<NL>up to
공백으로 바꿔야 합니다.
위의 문제를 무시하고 다음 Awk 명령 프로토타입을 얻을 수 있습니다.
$ awk 'BEGIN { RS = "~" }
{ gsub(/\n/,"",$0);
printf("%s", $0);
if (++i < 14) { printf("~"); }
else { i = 0; printf("\n"); } }' < in.txt > out.txt
~
각 필드가 실제로 레코드가 되도록 awk를 사용하여 레코드를 분할합니다 . 그런 다음 각 레코드에서 공백을 제거하는 데 사용 gsub
하고 필드가 1~13이면 인쇄하고 그 뒤에 구분 기호를 붙이거나 14이면 줄바꿈을 입력하고 개수를 재설정합니다.
필드 수를 14로 나눌 수 없는 경우 출력에 ~
개행 문자 대신 개행 문자로 끝나는 불완전한 마지막 줄이 표시됩니다.
연결 문제를 처리하는 한 가지 가능한 방법은 개행 문자를 그대로 두거나 데이터에 표시되지 않는 일부 문자로 바꾸는 것입니다. 사후 처리 단계로 연결을 수행합니다. @
데이터에서는 이런 일이 발생하지 않는다고 가정합니다 . 개행 문자를 로 대체하면 @
일반적인 텍스트 처리 도구를 사용하여 간단한 패턴 대체를 적용할 수 있습니다. 예를 들어, s/([0-9])@-/\1-/
손상된 날짜를 처리하는 것과 같은 방식으로 교체합니다(예: ) 06@-JAN
.
이 논리에서는 날짜 등을 구체적으로 처리할 수 있도록 개행을 제거해야 하는 특정 필드의 데이터 유형을 알아야 할 수도 있습니다.