위치를 찾아 값 목록으로 바꿉니다.

위치를 찾아 값 목록으로 바꿉니다.

다음과 같은 기록이 포함된 파일이 있습니다.

DL2016-12-02P123456             PW5038               1234561180118       123456O00400010180421          0755480            HEALTH            B   NOT APPLICABLE                                    NOT APPLICABLE     2016-08-012016-12-022016-09-012016-08-312016-09-302016-09-012016-09-30949569014            PW5018             07554800010001089200001       00100010892                   00000010304MDIRECT    00000000000000000000{          HPS                           PW5018COCOAA007708200000010304DXQ7262016001      

각 행의 385-396 및 415-427 필드에 있는 값의 형식을 지정하고 싶습니다. 예를 들어 00000010304M 000000000000{ 이 명령 cut -c 385-396,415-427 --output-delimiter=" "파일을 사용한 후입니다. 참조 00000010304M 000000000000{ 가이드 등에 따라 반환됩니다 M = -1. 보시다시피 위치 396의 데이터는 이고 위치 427의 데이터는 및 와 유사해야 합니다 . 여기서 M은 -1로 대체됩니다. 여기서 - 기호는 시작 부분에 배치되고 1은 M 위치에 배치됩니다. 또한 소수점 이하 2자리입니다.{ = +2N = +3M{-0000001030.41+00000000000.05

Last Character in Input Field|Positive or Negative|Last Number|Incoming Field|Value after replacement
{   +   0   12345{  1234.5
A   +   1   12345A  1234.51
B   +   2   12345B  1234.52
C   +   3   12345C  1234.53
D   +   4   12345D  1234.54
E   +   5   12345E  1234.55
F   +   6   12345F  1234.56
G   +   7   12345G  1234.57
H   +   8   12345H  1234.58
I   +   9   12345I  1234.59

}   -   0   12345}  -1234.5
J   -   1   12345J  -1234.51
K   -   2   12345K  -1234.52
L   -   3   12345L  -1234.53
M   -   4   12345M  -1234.54
N   -   5   12345N  -1234.55
O   -   6   12345O  -1234.56
P   -   7   12345P  -1234.57
Q   -   8   12345Q  -1234.58
R   -   9   12345R  -1234.59

파일에는 필드 번호 396에 M이 있으면 다음 데이터 열을 사용하여 현재 파일로 바꾸라고 나와 있습니다. 00000010304M이 -0000001030.44로 변경됨을 의미합니다. 참조 문서에서 이를 M-4 12345M -1234.54로 표시하는 것을 볼 수 있습니다. 예를 들어, M 문자는 앞에 - 기호가 있는 4로 바뀌고 이제 12345M 대신 -1234.54처럼 보입니다.

답변1

시작한 대로 계속할 수 있지만 cut필요에 따라 더 많은 부분으로 나눌 수 있습니다. 아이디어를 제공하기 위해 각 줄의 첫 번째 부분을 변환하는 짧은 조각이 있습니다.

cut -c 385-394,395,396 | \
while read integral dec suffix
do  case $suffix in
        '{');; # Nothing
        A) last=1;;
        B) last=2;;
        ...
        '}') sign=-;;
        J) sign=- last=1;;
        ...
    esac
    echo $sign$integral.$dec$last
done

당신은 이해했습니다. cut두 번째 숫자도 포함하도록 필드를 확장합니다 .

별도의 파일을 사용하여 마지막 문자를 번역하려는 경우 grep이 인라인 조회 대신 해당 파일의 콘텐츠를 사용할 수 있습니다.

관련 정보