如何在Linux终端中删除“最后一列”中包含0的行?

如何在Linux终端中删除“最后一列”中包含0的行?

"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 只要记录至少有一列。NF否则,0and $0$应用于数字的运算符0,不要将其与变量混淆)是整个记录。

² 严格来说,这是您的实现所识别的数字零的任何表示形式awk,其中还包括 , 等内容,000但有时也取决于实现或区域设置或环境/ , , ,或。要仅接受文字,请替换为-00E+12awk0.000,000x00x0p121e-5000XFFP-23450$NF != "0"

答案2

这是一个未经测试的猜测,因为我不知道你的.bed文件是什么样子,但这可能是你想要的,使用 GNU awk 或任何其他设置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

相关内容