特定の列で行を「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}'
NR
awk
現在のレコード番号(ここでは、基本レコード区切り文字を含む行番号)を保持する特殊変数です。$
フィールドを逆参照する演算子です。したがって、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を表示する1つの方法は次のとおりです。
$ 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