Stephen Hwang
Stephen Hwang

Reputation: 13

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.

Upvotes: 0

Views: 431

Answers (2)

JJenkx
JJenkx

Reputation: 19

If you ever need multiline lookarounds -0777 will make perl slurp the whole file at once and can be used for more complex matching requirements

perl -0777 -p -i -e 's/(?<=^AGREE   FIND_\d{6}\.FIND_\d{6})\.(?=FIND_\d{6}\.FIND_\d{6} )/   /gim' /mnt/c/Downloads/Test.txt

Example of multiline lookarounds

printf ".\nLookBehind2Lines\nLookBehindPreviousLine\nLookAheadNextLine\nLookAhead2Lines\n.\n" | tee /dev/tty | perl -0777 -pe 's/(?<=LookBehind2Lines\nLookBehindPreviousLine\n)(?=LookAheadNextLine\nLookAhead2Lines)/\nReplaced Zero Length Match Between Lookbehind and Lookahead\n\n/gim'

Upvotes: 0

Borodin
Borodin

Reputation: 126722

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

Upvotes: 3

Related Questions