
"0"
.tsv
最後の列の値が複数のファイルにある場合(すべてのファイルの最後の列番号が同じでない可能性がある)、行を削除する方法を知りたいです。列の総数はファイルごとに大きく異なります。
awk
正確に言えば、orの中にある行を探していますsed
。
これはファイルの最初の数行と列であり.tsv
、最後の列は"0"
削除する必要がある列です。ただし、最後の列番号はすべてのファイルに対して同じではありません。
$cut -f1-10 temp_13jLiC.bed | awk '{c=0;for(i=4;i<=NF;++i){c+=$i};print $0, "", c}' | head -n 10 | sed 's/ /\t/g'
chr1 0 100 . . . . . . . 0
chr1 100 200 . . . . . . . 0
chr1 200 300 . . . . . . . 0
chr1 300 400 . . . . . . . 0
chr1 400 500 . . . . . . . 0
chr1 500 600 . . . . . . . 0
chr1 600 700 . . . . . . . 0
chr1 700 800 . . . . . . . 0
chr1 800 900 . . . . . . . 0
chr1 900 1000 . . . . . . . 0
答え1
私は何をしますか:
awk '$NF != 0'
または、bedはタブ区切りの形式なので、フィールド内のスペースを許可します。
awk -F'\t' '$NF != 0'
$NF
自動的にそして魔法的に最後の列です。
最後の列が0
²の場合、行は印刷されません。
1レコードに1つ以上の列がある限り。NF
それ以外の場合、0
and $0
(変数と混同しないように$
数値に適用される演算子0
)はレコード全体です。
²厳密に言うと、これは実装で認識されている数字0の表現ですawk
。これにはのようなものも含まれますが、000
時には実装やロケールや環境に依存します / 、 、 または 。テキストのみを許可するには、次のように置き換えます。-0
0E+12
awk
0.00
0,00
0x0
0x0p12
1e-500
0XFFP-2345
0
$NF != "0"
答え2
これはあなたのファイルがどのように見えるかわからないのでテストされていないと思いますが、GNU awkまたはより低い値に.bed
設定された他の切り捨てを使用しておそらくあなたが望むものでしょう。NF
$0
awk 'BEGIN{FS=OFS="\t"} NR>10{exit} NF>10{NF=10} {c=0; for(i=4;i<=NF;++i) c+=$i} c{print $0, "", c}' temp_13jLiC.bed
設定の効果NF
はPOSIXでは未定義の動作であるため、NFを10に設定しても使用中のawkでフィールド数が10に切り捨てられない場合、次のようなすべてのawkで動作するいくつかの代替方法があります。
awk 'BEGIN{FS=OFS="\t"} NR>10{exit} {nf=(NF>10 ? 10 : NF); out=""; c=0; for(i=4;i<=nf;++i) {out=out $i OFS; c+=$i}} c{print out, c}' temp_13jLiC.bed