Linux端末の「最後の列」にゼロを含む行を削除する方法は?

Linux端末の「最後の列」にゼロを含む行を削除する方法は?

"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それ以外の場合、0and $0(変数と混同しないように$数値に適用される演算子0)はレコード全体です。

²厳密に言うと、これは実装で認識されている数字0の表現ですawk。これにはのようなものも含まれますが、000時には実装やロケールや環境に依存します / 、 、 または 。テキストのみを許可するには、次のように置き換えます。-00E+12awk0.000,000x00x0p121e-5000XFFP-23450$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

関連情報