以下のデータファイルがあります。
Sample1 Sample2 Sample3 Sample4 Sample5 Sample6
./. ./. ./. ./. ./. ./.
./. ./. ./. ./. A/G ./.
./. ./. ./. ./. ./. ./.
A/A A/A A/G ./. ./. ./.
./のみを含むすべての列を削除したいです。私に任せて
Sample1 Sample2 Sample3 Sample5
./. ./. ./. ./.
./. ./. ./. A/G
./. ./. ./. ./.
A/A A/A A/G ./.
私はこれがsedまたはawkコマンドだと思いますが、助けてくれてありがとう。
ベストアンサー1
使用awk
:
awk -v na="./." '
BEGIN{OFS=FS}
NR==FNR && NR>1 {
for(i=1;i<=NF;i++){if($i!=na){s[i]=1}}
}
NR!=FNR {
for(l in s){true}
for(i in s){if (i!=l){printf "%s"OFS,$i} else {printf "%s\n",$i}}
}
' file file
ファイルがタブで区切られている場合は、にBEGIN{OFS=FS}
変更する必要があります。BEGIN{OFS=FS="\t"}
説明する:
- ファイルを2回参照(
awk ... file file
) NR==FNR
ヘッダーを除外するために最初に列()の1つ以上の値ではないことNR>1
を確認した場合は、列番号を変数に保存します。i
na="./."
s
- 2番目の時間( )、
NR!=FNR
印刷された列の値に含まれる各列について。 (最初のループを使用すると、印刷する最後の列を知ることができます(印刷または.の間で決定できるように変数に保存されs
ます)。l
OFS
\n
出力:
Sample1 Sample2 Sample3 Sample5
./. ./. ./. ./.
./. ./. ./. A/G
./. ./. ./. ./.
A/A A/A A/G ./.
ファイルがタブで区切られている場合、出力は少し良くなります|column -t
。それ以外の場合は、次のように追加できます。
Sample1 Sample2 Sample3 Sample5
./. ./. ./. ./.
./. ./. ./. A/G
./. ./. ./. ./.
A/A A/A A/G ./.