여러 숫자를 Sed에 파이프

여러 숫자를 Sed에 파이프

숫자 목록을 sed로 파이프할 수 있나요?

현재 가지고 있는 파이프라인은 다음과 같습니다.

grep -nP 'foo' file_full.txt | sort | awk -F'[:;\t]' '{print $1,$3,$9,$13}' 

출력:

2374 213 MID=212 GO=1
2462 213 MID=477 GO=137
2394 233 MID=232 GO=1
2464 233 MID=668 GO=1070
2185 24 MID=23 GO=1
2465 24 MID=752 GO=1083
2146 48 MID=354 GO=1010
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1
2463 58 MID=595 GO=1057

나의 주요 목표는 $2에서 동일한 가치를 확인한 다음 $4 또는 GO 가치를 비교하는 것입니다. GO 값이 큰 행은 삭제해야 합니다.

sed 's/GO=/& /' | sort -k2,2 -k5n | awk 'a[$2]++ {sub(/GO= /,"GO="); print $1}'이전 파이프에 다음을 추가하면 다음을 얻습니다.

2462
2464
2465
2146
2463

file_full.txt에서 제거하려는 줄 번호 목록입니다.

나는 sed -i '2462d;2464d;2465d;2146d;2463d' file_full.txt그것이 가능하다는 것을 알고 있지만 위의 각 숫자를 sed 명령에 파이프하는 방법을 잘 모르겠습니다.

내가 뭐 놓친 거 없니?


원시 데이터:

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  i0      i1      i2      i3      i4      i5      i6      i7      i8      i9      i10     i11     i12     i13     i14
1       1       .       A       T       1000    PASS    MID=0;S=0.0324764;DOM=0.5;PO=1;GO=1;MT=0;AC=200;DP=1000 GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       2       .       A       T       1000    PASS    MID=1;S=0.0125739;DOM=0.5;PO=1;GO=1;MT=5;AC=200;DP=1000 GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       3       .       A       T       1000    PASS    MID=2;S=-0.0693919;DOM=0.5;PO=1;GO=1;MT=9;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       4       .       A       T       1000    PASS    MID=3;S=0.0611535;DOM=0.5;PO=1;GO=1;MT=12;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       5       .       A       T       1000    PASS    MID=4;S=-0.0791182;DOM=0.5;PO=1;GO=1;MT=16;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       6       .       A       T       1000    PASS    MID=5;S=0.0463103;DOM=0.5;PO=1;GO=1;MT=21;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       7       .       A       T       1000    PASS    MID=6;S=0.0509527;DOM=0.5;PO=1;GO=1;MT=25;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       8       .       A       T       1000    PASS    MID=7;S=-0.0134404;DOM=0.5;PO=1;GO=1;MT=28;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       9       .       A       T       1000    PASS    MID=8;S=-0.00478324;DOM=0.5;PO=1;GO=1;MT=32;AC=200;DP=1000      GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       10      .       A       T       1000    PASS    MID=9;S=0.03588;DOM=0.5;PO=1;GO=1;MT=36;AC=200;DP=1000  GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       11      .       A       T       1000    PASS    MID=10;S=-0.028843;DOM=0.5;PO=1;GO=1;MT=41;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       12      .       A       T       1000    PASS    MID=11;S=-0.0832497;DOM=0.5;PO=1;GO=1;MT=45;AC=200;DP=1000      GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       13      .       A       T       1000    PASS    MID=12;S=0.0389281;DOM=0.5;PO=1;GO=1;MT=48;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       14      .       A       T       1000    PASS    MID=13;S=0.0362106;DOM=0.5;PO=1;GO=1;MT=53;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       15      .       A       T       1000    PASS    MID=14;S=0.0375309;DOM=0.5;PO=1;GO=1;MT=57;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       16      .       A       T       1000    PASS    MID=15;S=0.0112808;DOM=0.5;PO=1;GO=1;MT=60;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       17      .       A       T       1000    PASS    MID=16;S=0.0243286;DOM=0.5;PO=1;GO=1;MT=65;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       18      .       A       T       1000    PASS    MID=17;S=0.0596463;DOM=0.5;PO=1;GO=1;MT=69;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       24      .       A       T       1000    PASS    MID=23;S=-0.0086571;DOM=0.5;PO=1;GO=1;MT=92;AC=199;DP=1000;MULTIALLELIC GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       58      .       A       T       1000    PASS    MID=57;S=-0.0926969;DOM=0.5;PO=1;GO=1;MT=229;AC=198;DP=1000;MULTIALLELIC        GT      1|1     0|1     1|1     1|1     0|1     1|1
1       213     .       A       T       1000    PASS    MID=212;S=-0.0925562;DOM=0.5;PO=1;GO=1;MT=848;AC=196;DP=1000;MULTIALLELIC       GT      1|1     1|1     1|1     1|1     1|1     1|1
1       233     .       A       T       1000    PASS    MID=232;S=-0.0868037;DOM=0.5;PO=1;GO=1;MT=929;AC=199;DP=1000;MULTIALLELIC       GT      1|1     1|1     1|1     1|1     1|1     1|1
1       213     .       A       T       1000    PASS    MID=477;S=0.0600971;DOM=0.5;PO=1;GO=1037;MT=849;AC=4;DP=1000;MULTIALLELIC       GT      0|0     0|0     0|0     0|0     0|0     0|0
1       58      .       A       T       1000    PASS    MID=595;S=0.0450203;DOM=0.5;PO=1;GO=1057;MT=228;AC=2;DP=1000;MULTIALLELIC       GT      0|0     1|0     0|0     0|0     1|0     0|0
1       233     .       A       T       1000    PASS    MID=668;S=-0.0447337;DOM=0.5;PO=1;GO=1070;MT=928;AC=1;DP=1000;MULTIALLELIC      GT      0|0     0|0     0|0     0|0     0|0     0|0
1       24      .       A       T       1000    PASS    MID=752;S=-0.104791;DOM=0.5;PO=1;GO=1083;MT=93;AC=1;DP=1000;MULTIALLELIC        GT      0|0     0|0     0|0     0|0     0|0     0|0

답변1

안타깝게도 귀하의 원시 데이터를 볼 수 없습니다. 라는 파일에 파이핑 결과가 주어지면 file올바른 결과를 얻을 수 있습니다.

$ sort -t ' ' -k2,2 -k4.4n file | sort -u -k2,2
2374 213 MID=212 GO=1
2394 233 MID=232 GO=1
2185 24 MID=23 GO=1
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1

이는 GO각 그룹에 대해 가장 작은 값을 갖는 데이터의 행입니다(두 번째 필드가 그룹을 정의함).

첫 번째는 각 그룹의 값이 작은 것부터 큰 것 순으로 정렬 sort되도록 데이터를 정렬하는 것입니다 . GO저것-k4.4n ~해야 한다쉼표가 아닌 점이 있습니다. 실제를 지정합니다네 번째 필드 다음은 =보조 정렬 키입니다.

두 번째는 sort두 번째 필드의 그룹 번호를 사용하여 고유하게 정렬합니다. 이는 출력에서 ​​각 고유 그룹의 첫 번째 행만 유지하는 효과가 있습니다.


나중에 질문에 추가된 원본 데이터를 사용하여:

sed 's/\./;./' file |
sort -t ';' -k1,1 -k6.4,6n |
sort -u -t ';' -k1,1 |
sed 's/;\././' |
sort -k1,1n -k2,2n

처음 두 sort호출은 이 답변의 앞부분과 동일한 작업을 수행합니다. 여기서는 처음 두 열(염색체 및 위치)을 "그룹 키"로 사용합니다.

첫 번째는 sed3열의 점을 ;.. 이는 ;두 호출 모두에서 필드 구분 기호로 올바르게 사용하기 위한 것입니다 sort. 두 번째 sed호출은 원래 지점을 복원합니다.

최종 sort데이터는 처음부터 염색체와 위치별로 정렬됩니다.

이로 인해

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  i0      i1      i2      i3      i4      i5      i6      i7      i8      i9      i10     i11     i12     i13     i14
1       1       .       A       T       1000    PASS    MID=0;S=0.0324764;DOM=0.5;PO=1;GO=1;MT=0;AC=200;DP=1000 GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       2       .       A       T       1000    PASS    MID=1;S=0.0125739;DOM=0.5;PO=1;GO=1;MT=5;AC=200;DP=1000 GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       3       .       A       T       1000    PASS    MID=2;S=-0.0693919;DOM=0.5;PO=1;GO=1;MT=9;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       4       .       A       T       1000    PASS    MID=3;S=0.0611535;DOM=0.5;PO=1;GO=1;MT=12;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       5       .       A       T       1000    PASS    MID=4;S=-0.0791182;DOM=0.5;PO=1;GO=1;MT=16;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       6       .       A       T       1000    PASS    MID=5;S=0.0463103;DOM=0.5;PO=1;GO=1;MT=21;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       7       .       A       T       1000    PASS    MID=6;S=0.0509527;DOM=0.5;PO=1;GO=1;MT=25;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       8       .       A       T       1000    PASS    MID=7;S=-0.0134404;DOM=0.5;PO=1;GO=1;MT=28;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       9       .       A       T       1000    PASS    MID=8;S=-0.00478324;DOM=0.5;PO=1;GO=1;MT=32;AC=200;DP=1000      GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       10      .       A       T       1000    PASS    MID=9;S=0.03588;DOM=0.5;PO=1;GO=1;MT=36;AC=200;DP=1000  GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       11      .       A       T       1000    PASS    MID=10;S=-0.028843;DOM=0.5;PO=1;GO=1;MT=41;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       12      .       A       T       1000    PASS    MID=11;S=-0.0832497;DOM=0.5;PO=1;GO=1;MT=45;AC=200;DP=1000      GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       13      .       A       T       1000    PASS    MID=12;S=0.0389281;DOM=0.5;PO=1;GO=1;MT=48;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       14      .       A       T       1000    PASS    MID=13;S=0.0362106;DOM=0.5;PO=1;GO=1;MT=53;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       15      .       A       T       1000    PASS    MID=14;S=0.0375309;DOM=0.5;PO=1;GO=1;MT=57;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       16      .       A       T       1000    PASS    MID=15;S=0.0112808;DOM=0.5;PO=1;GO=1;MT=60;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       17      .       A       T       1000    PASS    MID=16;S=0.0243286;DOM=0.5;PO=1;GO=1;MT=65;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       18      .       A       T       1000    PASS    MID=17;S=0.0596463;DOM=0.5;PO=1;GO=1;MT=69;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       24      .       A       T       1000    PASS    MID=23;S=-0.0086571;DOM=0.5;PO=1;GO=1;MT=92;AC=199;DP=1000;MULTIALLELIC GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       58      .       A       T       1000    PASS    MID=57;S=-0.0926969;DOM=0.5;PO=1;GO=1;MT=229;AC=198;DP=1000;MULTIALLELIC        GT      1|1     0|1     1|1     1|1     0|1     1|1
1       213     .       A       T       1000    PASS    MID=212;S=-0.0925562;DOM=0.5;PO=1;GO=1;MT=848;AC=196;DP=1000;MULTIALLELIC       GT      1|1     1|1     1|1     1|1     1|1     1|1
1       233     .       A       T       1000    PASS    MID=232;S=-0.0868037;DOM=0.5;PO=1;GO=1;MT=929;AC=199;DP=1000;MULTIALLELIC       GT      1|1     1|1     1|1     1|1     1|1     1|1

발췌줄 번호파이프라인에서 제거하려는 것은 일반적으로 그러한 작업을 수행하는 잘못된 방법입니다. 파이프라인의 각 부분은 동일한 파이프라인의 다른 모든 부분과 동시에 실행됩니다. 이는 한 섹션에서 파일을 덮어쓰거나 수정하는 동시에 다른 섹션에서 파일을 읽을 수 없음을 의미합니다.

또한 파이프라인의 다양한 단계를 통해 데이터를 가져올 때 전달되지 않은 데이터가 손실된다는 점에 유의하세요. 이로 인해 단일 파이프라인이 원본 데이터를 수정하도록 허용하는 것이 더 어려워집니다(파이프라인을 통과하는 도중 데이터가 손실되기 때문입니다).

따라서 해결책은 제거해야 할 것을 추출하거나 계산하는 것이 아니라 보관해야 하는 데이터 비트를 전달하는 것입니다.

답변2

예상한 결과가 표시되지 않지만 올바르게 이해했다면 다음과 같은 것을 찾고 있는 것입니다( file질문의 데이터 포함).

$ sort -t= -k3 -rn file | awk '{a[$2]=$0}END{for(i in a){print a[i]}}'
2185 24 MID=23 GO=1
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1
2374 213 MID=212 GO=1
2394 233 MID=232 GO=1

아이디어는 먼저 값을 기준으로 입력을 정렬하는 것입니다 GO. 필드 구분 기호를 로 -t=설정하면 세 번째 필드 뒤에 숫자가 배치됩니다 . 더 큰 숫자가 먼저 나오도록 역순으로 정렬합니다. 그런 다음 각 행은 배열의 값으로 저장되며, 해당 키는 두 번째 필드입니다. 파일은 값별로 정렬되므로 항상 각 의 최대값을 유지한다는 의미입니다 . 그런 다음 파일 끝에서 배열을 인쇄합니다.sort=GOawkaGO$2


또는 원본 파일에서 직접 모든 작업을 수행할 수 있습니다.

$ awk -F'[\t=;]' '/^[^#]/{
                    if(!a[$1$2] || a[$1$2]>$17){
                        line[$1$2]=$0; 
                        a[$1$2]=$17
                    }
                   } 
                   END{
                    for(i in a){
                        print line[i]
                    }
                   }' file.vcf 
1   1   .   A   T   1000    PASS    MID=0;S=0.0324764;DOM=0.5;PO=1;GO=1;MT=0;AC=200;DP=1000 GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   2   .   A   T   1000    PASS    MID=1;S=0.0125739;DOM=0.5;PO=1;GO=1;MT=5;AC=200;DP=1000 GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   3   .   A   T   1000    PASS    MID=2;S=-0.0693919;DOM=0.5;PO=1;GO=1;MT=9;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   4   .   A   T   1000    PASS    MID=3;S=0.0611535;DOM=0.5;PO=1;GO=1;MT=12;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   5   .   A   T   1000    PASS    MID=4;S=-0.0791182;DOM=0.5;PO=1;GO=1;MT=16;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   6   .   A   T   1000    PASS    MID=5;S=0.0463103;DOM=0.5;PO=1;GO=1;MT=21;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   7   .   A   T   1000    PASS    MID=6;S=0.0509527;DOM=0.5;PO=1;GO=1;MT=25;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   8   .   A   T   1000    PASS    MID=7;S=-0.0134404;DOM=0.5;PO=1;GO=1;MT=28;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   9   .   A   T   1000    PASS    MID=8;S=-0.00478324;DOM=0.5;PO=1;GO=1;MT=32;AC=200;DP=1000  GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   10  .   A   T   1000    PASS    MID=9;S=0.03588;DOM=0.5;PO=1;GO=1;MT=36;AC=200;DP=1000  GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   11  .   A   T   1000    PASS    MID=10;S=-0.028843;DOM=0.5;PO=1;GO=1;MT=41;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   12  .   A   T   1000    PASS    MID=11;S=-0.0832497;DOM=0.5;PO=1;GO=1;MT=45;AC=200;DP=1000  GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   13  .   A   T   1000    PASS    MID=12;S=0.0389281;DOM=0.5;PO=1;GO=1;MT=48;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   14  .   A   T   1000    PASS    MID=13;S=0.0362106;DOM=0.5;PO=1;GO=1;MT=53;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   15  .   A   T   1000    PASS    MID=14;S=0.0375309;DOM=0.5;PO=1;GO=1;MT=57;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   16  .   A   T   1000    PASS    MID=15;S=0.0112808;DOM=0.5;PO=1;GO=1;MT=60;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   17  .   A   T   1000    PASS    MID=16;S=0.0243286;DOM=0.5;PO=1;GO=1;MT=65;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   18  .   A   T   1000    PASS    MID=17;S=0.0596463;DOM=0.5;PO=1;GO=1;MT=69;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   24  .   A   T   1000    PASS    MID=23;S=-0.0086571;DOM=0.5;PO=1;GO=1;MT=92;AC=199;DP=1000;MULTIALLELIC GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   58  .   A   T   1000    PASS    MID=57;S=-0.0926969;DOM=0.5;PO=1;GO=1;MT=229;AC=198;DP=1000;MULTIALLELIC    GT  1|1 0|1 1|1 1|1 0|1 1|1
1   213 .   A   T   1000    PASS    MID=212;S=-0.0925562;DOM=0.5;PO=1;GO=1;MT=848;AC=196;DP=1000;MULTIALLELIC   GT  1|1 1|1 1|1 1|1 1|1 1|1
1   233 .   A   T   1000    PASS    MID=232;S=-0.0868037;DOM=0.5;PO=1;GO=1;MT=929;AC=199;DP=1000;MULTIALLELIC   GT  1|1 1|1 1|1 1|1 1|1 1|1

여기서의 비결은 awk의 입력 필드 구분 기호를 또는 로 -F'[\t=;]'설정하는 것 입니다 . 이렇게 하면 GO 값 필드가 17이 됩니다(모든 행의 구조가 동일하다고 가정하고 그렇지 않은 경우 문의하세요).\t=;생물정보학다른 도구를 사용하면 더 잘 처리할 수 있기 때문입니다.) 나머지는 다음을 의미합니다.

  • /^[^#]/{ }: 로 시작하지 않는 줄에서 이 작업을 수행합니다 #.
  • if(a[$1$2]<$17){: 배열에 저장된 첫 번째와 두 번째 필드(염색체 및 위치)의 값이 a해당 행의 17번째 필드보다 작은 경우
  • line[$1$2]=$0;: 이 행을 배열의 필드 1과 2의 결합된 값으로 저장합니다 line.
  • a[$1$2]=$17: 17번째 필드를 배열의 첫 번째 필드와 두 번째 필드의 결합된 값으로 저장합니다 a.
  • END{for(i in a){print a[i]}}: 위와 동일하게 라인을 인쇄합니다.

이제 두 번째 필드의 각 고유 값에 대해 전체 행을 저장해야 합니다. 파일이 매우 큰 경우 문제가 될 수 있습니다.

이 문제를 피하는 명백히 우아하지 않은 방법은 기본적으로 원래 요청한 것을 수행하고 줄 번호를 사용하는 것입니다. 그것은 다음과 같습니다:

awk -F'[\t=;]' 'NR==FNR && /^[^#]/{
                    if(!a[$1$2] || a[$1$2]>$17){
                        want[$1$2]=NR; 
                        a[$1$2]=$17
                    }
                } 
                NR!=FNR && want[$1$2]==FNR' file.vcf file.vcf

답변3

일반 name 을 사용하여 표준 입력을 통해 sed 스크립트를 파이프할 수 있습니다 -. 귀하가 제공한 샘플을 폐기하고 사용하지 않은 샘플은 폐기합니다 $9.

grep -n = full.txt \
| awk -F'[:;\t]' '{sub(/.*=/,"",$13); print $1,$3,$13 }' \
| sort -nk2,3 \
| awk 'last==$2{print $1"d"}last=$2' \
# | sed -i -f- full.txt

sed -i '' etcMac을 사용하는 경우 백업 확장 프로그램을 강제로 실행하려면 해당 기능을 끄라고 말해야 합니다 .

정렬하기 전에 데이터를 최대한 줄이기 위해서는 약속이 큰 파일을 사용하는 것이 더 좋다고 생각합니다.

$1"p"for를 삽입 $1"d"하고 실행 |sed -nf- full.txt하여 삭제하려는 행을 인쇄하면 다음과 같은 결과가 나타납니다.

$ grep -n = full.txt     | awk -F'[:;\t]' '{sub(/.*=/,"",$13); print $1,$3,$13 }'     | sort -nk2,3     | awk 'last==$2{print $1"p"}{last=$2}' | sed -nf- full.txt
1       213     .       A       T       1000    PASS    MID=477;S=0.0600971;DOM=0.5;PO=1;GO=1037;MT=849;AC=4;DP=1000;MULTIALLELIC       GT      0|0     0|0     0|0     0|0     0|0     0|0
1       58      .       A       T       1000    PASS    MID=595;S=0.0450203;DOM=0.5;PO=1;GO=1057;MT=228;AC=2;DP=1000;MULTIALLELIC       GT      0|0     1|0     0|0     0|0     1|0     0|0
1       233     .       A       T       1000    PASS    MID=668;S=-0.0447337;DOM=0.5;PO=1;GO=1070;MT=928;AC=1;DP=1000;MULTIALLELIC      GT      0|0     0|0     0|0     0|0     0|0     0|0
1       24      .       A       T       1000    PASS    MID=752;S=-0.104791;DOM=0.5;PO=1;GO=1083;MT=93;AC=1;DP=1000;MULTIALLELIC        GT      0|0     0|0     0|0     0|0     0|0     0|0
$

관련 정보