awk는 마지막 레코드와 일치하여 인쇄합니다.

awk는 마지막 레코드와 일치하여 인쇄합니다.

내가 얻은 기록은 다음과 같습니다 fileinp.

1 ABCDEFGHILM                12345678901234567   ABCD   X
1 CDEFGHILMNO                34567890123456789   BCDE   Y
1 EFGHILMNOPQ                56789012345678901   CDEF   Z
1 GHILMNOPQRS                78901234567890123   DEFG   W

마지막 문자가 Y 또는 Z이면 문자 14부터 문자 47까지 인쇄하고 마지막 일치 문자를 추가하고 싶습니다.

예상 결과는 다음과 같습니다 fileout.

        34567890123456789Y
        56789012345678901Z

여러 코드를 시도했지만 모두 실패했습니다.

gawk "{print /Y/ substr($1,14,33, length($1)-0)}" fileinp > fileout 

저 좀 도와 주 시겠어요?

사실 완전한 기록이라 마지막 글자를 검색해 보니까

1 QWERTYUIOPASDFGHJK         ZXCVBNMLKJHGFDSAP   1234        12345678 12345ABCDEFGHIL12                                                                                                    202000Y

답변1

제공한 예제 입력의 경우 마지막 필드는 1자입니다.

$ awk '$NF~/[YZ]/{print substr($0,14,33) $NF}' file
                34567890123456789Y
                56789012345678901Z

나중에 제공한 실제 데이터 행의 경우 마지막 필드가 여러 문자이고 마지막 필드에 Y 또는 Z가 존재할 수 있는 위치에 대해 가정하지 않습니다.

$ awk 'match($0,/[YZ][^[:space:]]*$/){print substr($0,14,33) substr($0,RSTART,1)}' file
                34567890123456789Y
                56789012345678901Z

또는 Y 또는 Z가 항상 줄의 마지막 문자인 경우:

$ awk '/[YZ]$/{print substr($0,14,33) substr($0,length($0))}' file
                34567890123456789Y
                56789012345678901Z

답변2

이는 거의 정확하지만 새 레코드 이후에 Y 또는 Z가 누락되었습니다.

gawk "$NF~/Y|Z/{print substr($0,14,33)}" fileinp > fileout

결과:

        34567890123456789
        56789012345678901

예상되는 결과:

        34567890123456789Y
        56789012345678901Z

답변3

나는 이것을 시도한다:

gawk "$NF~/Y|Z/{print substr($0,14,33) substr($0,194,1)}" fileinp > fileout

하지만 마지막 문자 앞에 공백 문자가 표시됩니다.

    34567890123456789 Y
    56789012345678901 Z

나는 또한 이것을 시도했고 작동했지만 실제로 마지막 문자는 아닙니다.

gawk "$NF~/Y|Z/{print substr($0,14,33) substr($NF,7,1)}" fileinp > fileout

    34567890123456789Y
    56789012345678901Z

관련 정보