소스를 플랫 파일로 가져오고 캐리지 리턴과 \n... 특수 문자를 제거하시겠습니까?

소스를 플랫 파일로 가져오고 캐리지 리턴과 \n... 특수 문자를 제거하시겠습니까?

\nPIPE 구분 기호가 있는 많은 수의 레코드가 포함된 플랫 파일 소스가 제공되고 필드 중 하나가 캐리지 리턴(여러 줄)을 받고 줄 바꿈( )으로 시작하는 문제가 발생했습니다 . 그렇다면 \n파일에서 문자를 삭제하는 방법은 무엇입니까?

예:

-000123456|1654321|6/12/2002 8:49:20 AM|
tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|

누구든지 진행 방법을 제안할 수 있나요?

답변1

\n모든 레코드에서 필드가 이 필드로 시작한다는 것을 알고 있는 경우 sed다음과 같이 사용할 수 있습니다.

sed "N;s/|\n/|/"

새로운 줄을 제거하십시오. 줄 구분 기호 sed로 사용되므로 먼저 \n다음 줄을 이미 처리된 줄(command)에 연결하고 N프로세스의 sed연결된 줄 사이에 개행 문자를 삽입해야 합니다 .

이 문제가 무작위로 발생하는 경우(모든 레코드에서 발생하는 것은 아님) 파일 내용을 구문 분석하기 위해 보다 강력한 도구를 사용해야 합니다. 기본적으로 필드 수를 계산해야 합니다. 아니면 awk이 트릭을 우아하게 수행할 수도 있습니다. (내 생각 perl엔 그것도 수행할 수 있을 것 같지만 아마 가고 싶지 않을 것입니다.)sed그 방향).

답변2

사용할 수 있는 도구는 많지만 sed이러한 도구는 다음을 위해 만들어졌습니다.

 sed -i 's,\\n,,g' Flatfile

작동 방식을 보여주기 위해 방금 제공한 입력과 동일한 표현식은 다음과 같습니다.

$ echo '-000123456|1654321|6/12/2002 8:49:20 AM|\n tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|' | sed 's,\\n,,g'
-000123456|1654321|6/12/2002 8:49:20 AM| tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|

단지 문자열을 찾아 \n길이가 0인 빈 문자열로 바꿉니다(효과적으로 삭제). 가 두 개 있으므로 특별한(개행) 의미를 잃고 두 문자로 일치될 수 있습니다 \.\n

관련 정보