"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
否则,0
and $0
($
应用于数字的运算符0
,不要将其与变量混淆)是整个记录。
² 严格来说,这是您的实现所识别的数字零的任何表示形式awk
,其中还包括 , 等内容,000
但有时也取决于实现或区域设置或环境/ , , ,或。要仅接受文字,请替换为-0
0E+12
awk
0.00
0,00
0x0
0x0p12
1e-500
0XFFP-2345
0
$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