Search code examples
regexperl

Need perl one-liner to split string in specific column of text file


I have the following tab delimited file

AGREE   FIND_008903.FIND_008907.FIND_008903.FIND_008904 0.5026 0.2524
AGREE   FIND_000499.FIND_000503.FIND_000499.FIND_000502 0.5699 0.2790
AGREE   FIND_004339.FIND_004342.FIND_004339.FIND_004341 0.5307 0.2562
AGREE   FIND_008097.FIND_008100.FIND_008097.FIND_008098 0.5000 0.2456

I need a perl one-liner to replace the 2nd period so that the result is

AGREE   FIND_008903.FIND_008907   FIND_008903.FIND_008904 0.5026 0.2524
AGREE   FIND_000499.FIND_000503   FIND_000499.FIND_000502 0.5699 0.2790
AGREE   FIND_004339.FIND_004342   FIND_004339.FIND_004341 0.5307 0.2562
AGREE   FIND_008097.FIND_008100   FIND_008097.FIND_008098 0.5000 0.2456

I've tried this but it replaces all periods.

> perl -pe 'tr/(\w+\.\w+)\.(\w+\.\w+)/$1\t$2/s' /share/nas04/bioinformatics_group/data/studies/phenx/FIND/Stephen/Processed/king/FIND_AA.ld_pruned.ibd_king_comparison


AGREE   FIND_008903$FIND_008907$FIND_008903$FIND_008904 0$5026 0$2524
AGREE   FIND_000499$FIND_000503$FIND_000499$FIND_000502 0$5699 0$2790
AGREE   FIND_004339$FIND_004342$FIND_004339$FIND_004341 0$5307 0$2562
AGREE   FIND_008097$FIND_008100$FIND_008097$FIND_008098 0$5000 0$2456

I appreciate any guidance.


Solution

  • There's no need for such complexity. This will do what you ask

    perl -pe 's/\.[^.]*\K\./\t/' myfile
    

    output

    AGREE   FIND_008903.FIND_008907 FIND_008903.FIND_008904 0.5026 0.2524
    AGREE   FIND_000499.FIND_000503 FIND_000499.FIND_000502 0.5699 0.2790
    AGREE   FIND_004339.FIND_004342 FIND_004339.FIND_004341 0.5307 0.2562
    AGREE   FIND_008097.FIND_008100 FIND_008097.FIND_008098 0.5000 0.2456