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

関連情報