删除第二列中带有数字零的行

remove rows with numerical zero in the second column

提问人:Shafaque Zahra 提问时间:10/28/2023 最后编辑:markp-fusoShafaque Zahra 更新时间:10/28/2023 访问量:106

问:

我有一个制表符分隔的文件,需要过滤值为零的行。

$ head my_file.txt
id  SRR1385501
chr1:11672:+::chr1:12009:+  0 
chr1:14830:-::chr1:14969:-  8 
chr1:14830:-::chr1:15795:-  0 
chr1:15039:-::chr1:15795:-  2 
chr1:15948:-::chr1:16606:-  10

我正在尝试使用以下命令(awk 版本:GNU 4.0.2,但它仍在删除标题)

$ awk '$2 !=0' my_file.txt
chr1:14830:-::chr1:14969:-  8 
chr1:15039:-::chr1:15795:-  2 
chr1:15948:-::chr1:16606:-  10

我想要的输出是:

id  SRR1385501
chr1:14830:-::chr1:14969:-  8 
chr1:15039:-::chr1:15795:-  2 
chr1:15948:-::chr1:16606:-  10
Linux UNIX AWK

评论

1赞 pmf 10/28/2023
尝试 github.com/onetrueawk/awk(awk 版本 20231001)和 gnu.org/software/gawk (GNU Awk 5.2.2),您的方法会产生所需的输出。
0赞 Shafaque Zahra 10/28/2023
我有 GNU Awk 4.0.2,它正在删除标题,还有其他命令吗?
3赞 anubhava 10/28/2023
尝试:awk 'FNR==1 || $2' my_file.txt
0赞 Ed Morton 10/28/2023
要调试您的问题,请将您的脚本更改为 ,完全按照您在问题中显示的输入运行它,然后编辑您的问题以显示其输出。awk '{print NR, NF, "[" $0 "]"; for (i=1; i<=NF: i++) print "\t" i, "<" $i ">"} $2 != 0' my_file.txt | cat -A
0赞 glenn jackman 10/28/2023
根据 ftp.gnu.org/gnu/gawk,该版本已有 11 年的历史。你能升级吗?

答:

7赞 Ed Morton 10/28/2023 #1

使用任何 awk,这将做你想要的:

$ awk '$2 != "0"' file
id  SRR1385501
chr1:14830:-::chr1:14969:-  8
chr1:15039:-::chr1:15795:-  2
chr1:15948:-::chr1:16606:-  10

上面假设您的第二列始终具有“数字零”的字符串,而不是 or or 或其他任何内容。00.0-0+0

您得到的结果与 awk 比较的工作方式不一致:

比较两个操作数时,字符串比较或数字 可以使用比较。这取决于 操作数,根据以下对称矩阵:

+----------------------------------------
|           STRING    NUMERIC    STRNUM
+---------+------------------------------
| STRING  | string    string     string
| NUMERIC | string    numeric    numeric
| STRNUM  | string    numeric    numeric
+---------+------------------------------

$2输入的第一行应该为 type,因为看起来不像 awk 的数字,其余部分的 type 是因为所有其他值(例如 和 )看起来都像数字,但 awk 最初无法判断您是要将它们用作数字还是字符串。STRINGSRR1385501STRNUM08

根据上表,那么,()和()之间的比较类型应该是,并且这两个值不是同一个字符串,因此应该打印标题。其余的只是比较。SRR1385501STRING0NUMERICstringSTRNUMNUMERICnumeric

我建议获取新版本的 gawk(我们现在使用的是 5.3),因为您的版本已经过时,并且可能包含错误,但我对此表示高度怀疑,因为这将是重大损坏。更有可能的是,您的输入文件或脚本与您目前展示和告诉我们的内容有所不同。

评论

0赞 Shafaque Zahra 10/28/2023
非常感谢和真诚的尊重埃德。即使对于我的简单问题,我也非常感谢您的帮助。
0赞 Ed Morton 10/28/2023
不客气,但你真的应该按照我在评论中的建议去做,这样我们就可以帮助你找出问题的根源。
3赞 karakfa 10/28/2023 #2

最小值将是awk

$ awk '$2' file

id  SRR1385501
chr1:14830:-::chr1:14969:-  8
chr1:15039:-::chr1:15795:-  2
chr1:15948:-::chr1:16606:-  10

这假设您的标头将具有第二个具有非零值的字段。

评论

0赞 Ed Morton 10/28/2023
如果这可行,那么 OP 已经拥有的东西也应该有效。$2 != 0