파일의 단일 레코드가 여러 줄로 분할됩니다.

파일의 단일 레코드가 여러 줄로 분할됩니다.

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.

이 논리에서는 날짜 등을 구체적으로 처리할 수 있도록 개행을 제거해야 하는 특정 필드의 데이터 유형을 알아야 할 수도 있습니다.

관련 정보