Unix에서 고정 길이 파일 사이의 개행 제거

Unix에서 고정 길이 파일 사이의 개행 제거

호스트에서 고정 길이 파일의 특정 속성을 가져오면서 가비지 문자를 얻었으므로 이 가비지 문자가 개행 문자로 읽혀지고 결과적으로 전체 데이터가 손상되었습니다.

파일의 데이터 예

0401000000030020170628000000710000366400201706280002750035*T000100N▒101892928550383900000009201 00000000000008402017062800000020  0000006435000000000000000840A1E098D09D9279BE4000561510A00003220000000000000000000000FF

0401000000030020170628000000710000365400201706280001041125
T000100N▒101909856755446700000018201 00000000000008402017062800000000  00000067540000000000000008402ED730917E9D1DC040000B0810A04003240000000000000000000000FF

가비지 문자를 받았지만 첫 번째 레코드는 정확 *T000100N▒하지만 두 번째 레코드의 경우 T000100N▒가비지 문자가 새 줄 문자로 읽혀집니다.

답변1

귀하의 예에서 sed성공 :

sed '/^.\{216\}$/!N;s/./?/59' file

이 주소는 /^.\{216\}$/!필수 216자 길이가 아닌 행에서 다음 명령을 실행합니다. 이 경우 줄이 분할되어 N나머지 줄을 읽는다고 가정합니다.

그런 다음 명령 은 레코드의 s59번째 문자( *또는 개행 문자)를 물음표로 바꿉니다(필요에 따라 변경).

이는 귀하의 예에서는 작동하지만 다른 임의 바이트나 멀티바이트 문자가 스크립트를 손상시킬지는 확실하지 않습니다.

따라서 sed모든 경우에 작동하지 않는다면 다음과 같은 훌륭한 도구를 사용하십시오.bbe이진 데이터를 포함한 고정 길이 레코드를 처리하는 데 이상적입니다.

bbe -b ":219" -e 'r 58 ?' file

-b ":219"블록 크기를 219(줄 바꿈 및 멀티바이트 문자 포함)로 정의하고 r 58 ?오프셋 58의 바이트를 물음표로 바꿉니다(따라서 59번째 문자임).

관련 정보