내가 얻은 기록은 다음과 같습니다 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