특정 열에서 가능한 3가지 변수 중 어느 것과도 같지 않은 행을 편집합니다(바람직하게는 awk에서).

특정 열에서 가능한 3가지 변수 중 어느 것과도 같지 않은 행을 편집합니다(바람직하게는 awk에서).

특정 열에서 행을 "X"로 바꿔야 하지만 가능한 3가지 패턴(변수 3개) 중 어느 것과도 일치하지 않는 경우에만 해당됩니다. 열이 항상 동일한 열은 아니므로 코드는 열 번호 자체가 변수 번호인 상태에서 작동해야 합니다. 3가지 가능한 모드에 대해서도 마찬가지입니다. 시연 없이 설명하기는 어렵습니다. 이 예에서 열 1을 보고 "GrabVariantOption"을 기반으로 "X"에 특정한 항목이 어떻게 변경되는지 보면 제가 설명할 수 있는 것보다 더 명확할 것입니다.

입력 예:

A,A,A,X
A,G,T,X
C,A,G,T
A,C,G,T
f,X,A,g
g,T,A,A
m,s,G,A
G,s,m,A

예시 3 가능한 패턴:

GrabVariantOption1=A
GrabVariantOption2=g
GrabVariantOption3=G

일부 의사 코드는 이것이 내가 원하는 작업의 원칙입니다.

Column=1   

awk -F ',' -v a=$GrabVariantOption1 -v b=$GrabVariantOption2 -v c=$GrabVariantOption3 -v x=$Column '{$x; if NR!=a && NR!=b && NR!=c; flag=1} {if flag=1 NR==X }'

예제 출력:

A,A,A,X
A,G,T,X
X,A,G,T
A,C,G,T
X,X,A,g
g,T,A,A
X,s,G,A
G,s,m,A

답변1

awk -F, -v OFS=, \
  -v "a=$GrabVariantOption1" \
  -v "b=$GrabVariantOption2" \
  -v "c=$GrabVariantOption3" \
  -v "x=$Column" '
  $x != a && $x != b && $x != c {$x = "X"}
  {print}'

또는 여기에 단일 ASCII 문자가 있습니다.

awk -F, -v OFS=, \
  -v "pattern=^[$GrabVariantOption1$GrabVariantOption2$GrabVariantOption3]\$" \
  -v "x=$Column" '
  $x !~ pattern {$x = "X"}
  {print}'

NRawk현재 레코드 번호(여기서는 기본 레코드 구분 기호가 있는 줄 번호)를 보유하는 특수 변수입니다 . $필드를 역참조하는 연산자입니다. 따라서 x필드 번호 가 번째$ x 필드의 내용을 제공하는 경우.x

답변2

또 다른 옵션:

awk -v col=1 -v keys="$GrabVariantOption1,$GrabVariantOption2,$GrabVariantOption3" '
    BEGIN {
        FS = OFS = ","

        # keys is a single string: "A,g,G"

        n = split(keys, a)

        # now, n=3 and a is the array ("A", "g", "G")

        for (i=1; i<=n; i++) keep[a[i]] = 1

        # now, keep is an associative array mapping "A"=>1, "g"=>1, "G"=>1
        # ("A" in keep) is true
        # ("C" in keep) is false
    }
    !($col in keep) {$col = "X"}
    {print}
' input

답변3

이 시도,

awk -F ',' -v a=$GrabVariantOption1 -v b=$GrabVariantOption2 -v c=$GrabVariantOption3 -v x=$Column -v OFS=',' '{if (($x != 'a') && ($x != 'b') && ($x != 'c')) {$x="X"}; print }' input.txt 
A,A,A,X
A,G,T,X
X,A,G,T
A,C,G,T
X,X,A,g
g,T,A,A
X,s,G,A
G,s,m,A

답변4

확장 정규 표현식과 함께 Gnu sed를 사용하여 pbm을 보는 한 가지 방법은 다음과 같습니다.

$ col=1 opt1=G opt2=g opt3=G
$ opt=${opt1}${opt2}${opt3}
$ sed -Ee "
   s/^/,/
   s/(([^,]*,){$col})[^$opt]/\1X/
   s/,//
" file.csv

Perl을 사용하면 다음과 같은 작업도 수행할 수 있습니다.

$ perl -lpe "
   s/^/,/;
   substr(\$_,2*$col-1,1) =~ tr/$opt/X/c;
   s/,//;
" file.csv

관련 정보