Perl 또는 awk를 사용하여 파일을 제자리에서 편집합니다.

Perl 또는 awk를 사용하여 파일을 제자리에서 편집합니다.

아래와 같이 큰 탭으로 구분된 입력 파일이 있습니다.

SF_0000000555_RDNAU_58_10293    10873   11041   +       ID=match41;Target=SF_0000000005 99 267 168
SF_0000000555_RDNAU_58_10293    188079  188215  +       ID=match2617;Target=SF_0000000020 3 138 135
SF_0000000555_RDNAU_58_10293    137594  137704  -       ID=match4142;Target=SF_0000000048 16 126 110
SF_0000000555_RDNAU_58_10293    70582   71504   -       ID=match45147;Target=SF_0000000350 8970 9886 916
SF_0000000555_RDNAU_58_10293    100212  101204  -       ID=match45148;Target=SF_0000000350 9584 10597 1013
SF_0000000555_RDNAU_58_10293    101165  101747  -       ID=match45149;Target=SF_0000000350 9005 9581 576
SF_0000000555_RDNAU_58_10293    82434   82891   -       ID=match45150;Target=SF_0000000350 9273 9730 457

나는 아래와 같이 출력을 원한다

SF_0000000555   10873   11041   +       SF_0000000005 99 267 168
SF_0000000555   188079  188215  +       SF_0000000020 3 138 135
SF_0000000555   137594  137704  -       SF_0000000048 16 126 110
SF_0000000555   70582   71504   -       SF_0000000350 8970 9886 916
SF_0000000555   100212  101204  -       SF_0000000350 9584 10597 1013
SF_0000000555   101165  101747  -       SF_0000000350 9005 9581 576
SF_0000000555   82434   82891   -       SF_0000000350 9273 9730 457

awk나 Perl을 사용하여 파일을 편집하는 방법을 알려주실 수 있나요? cut 명령을 사용하여 각 개별 열을 편집하고 다음 명령을 사용하여 함께 병합해 보았습니다.

awk '{print $1}' |cut -d "_" -f 1-2
awk '{print $5}' |cut -d ";" -f 2- | cut -d "=" -f 2

미리 감사드립니다.

답변1

내부 편집의 경우 다음과 같은 작업을 수행하는 것이 더 쉬울 수 있습니다.

sed -i "s/\t/ /g" file.txt \
&& sed -i "s/ID=match[[:digit:]]\+;Target=//g" test.txt \
&& sed -i "s/_RDNAU_[[:digit:]]\+_[[:digit:]]\+//g" test.txt

약간의 무차별 대입이지만 훨씬 쉽습니다.

답변2

$ awk 'BEGIN{FS=OFS="\t"} {sub(/(_[^_]+){3}$/,"",$1); sub(/.*=/,"",$5)}1' file
SF_0000000555   10873   11041   +       SF_0000000005   99      267     168
SF_0000000555   188079  188215  +       SF_0000000020   3       138     135
SF_0000000555   137594  137704  -       SF_0000000048   16      126     110
SF_0000000555   70582   71504   -       SF_0000000350   8970    9886    916
SF_0000000555   100212  101204  -       SF_0000000350   9584    10597   1013
SF_0000000555   101165  101747  -       SF_0000000350   9005    9581    576
SF_0000000555   82434   82891   -       SF_0000000350   9273    9730    457

-i inplaceGNU awk를 사용하면 sed 및 Perl과 마찬가지로 "내부" 편집을 추가할 수 있습니다 -i. awk를 사용하면 물론 awk 'script' file > tmp && mv tmp file다른 명령처럼 수행할 수 있습니다.

답변3

이 시도:

awk -v FS='\t' -v OFS='\t' '{
    split($1, a, "_"); $1 = a[1]"_"a[2];
    sub(/.*=/, "", $5);
    print
}' input > output

이는 원본 파일의 공백이 실제로 탭이라고 가정합니다. 그렇지 않은 경우 이러한 -v..옵션을 제거할 수 있습니다.

k1=v1;k2=v2;...다섯 번째 필드의 순서가 임의대로이거나 마지막이 아닐 수 있는 경우에는 더 Target=SF..복잡한 것이 필요하지만 사용 가능한 정보로는 무엇인지 추측하기 어렵습니다.

파일을 "제자리에서" 편집하려면 파일 이름을 원본 파일로 바꾸세요.

awk '...' input > tmpfile && mv tmpfile input

답변4

펄에서는:

#!/usr/bin/perl

use feature 'say';

while(<>) {
  chomp;                            # strip the trailing end-of-line character(s).
  my (@F) = split;                  # split the input line into fields

  $F[0] =~ s/(^[^_]*_[^_]*)_.*/$1/; # strip everything from 2nd _ from field 1
  $F[4] =~ s/^ID=[^;]*;Target=//;   # strip from ID= to Target= from field 5

  say join("\t",@F);                # print all the fields separated by a tab.
}

라인으로 원하는 경우 :

perl -lane '$F[0] =~ s/(^[^_]*_[^_]*)_.*/$1/;
            $F[4] =~ s/^ID=[^;]*;Target=//;
            print join("\t",@F);' input.txt

Perl -l옵션은 자동 줄 끝 처리(chomp)를 활성화합니다. -aawk와 유사한 자동 필드 분할( array 로)을 켭니다 @F. -a또한 암시적으로 활성화되지만 -n( while(<>){ .. }Perl 코드 주위에 자동으로 루프를 배치) 이 옵션을 명시적으로 지정하는 것을 선호합니다. man perlrun자세히보다.

Perl 배열은 1이 아닌 0에서 시작합니다.

출력 예(독립형 또는 단일 행 버전):

SF_0000000555   10873   11041   +       SF_0000000005   99      267     168
SF_0000000555   188079  188215  +       SF_0000000020   3       138     135
SF_0000000555   137594  137704  -       SF_0000000048   16      126     110
SF_0000000555   70582   71504   -       SF_0000000350   8970    9886    916
SF_0000000555   100212  101204  -       SF_0000000350   9584    10597   1013
SF_0000000555   101165  101747  -       SF_0000000350   9005    9581    576
SF_0000000555   82434   82891   -       SF_0000000350   9273    9730    457

관련 정보