提问人:Shafaque Zahra 提问时间:10/28/2023 最后编辑:markp-fusoShafaque Zahra 更新时间:10/28/2023 访问量:106
删除第二列中带有数字零的行
remove rows with numerical zero in the second column
问:
我有一个制表符分隔的文件,需要过滤值为零的行。
$ 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
答:
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 或其他任何内容。0
0.0
-0
+0
您得到的结果与 awk 比较的工作方式不一致:
比较两个操作数时,字符串比较或数字 可以使用比较。这取决于 操作数,根据以下对称矩阵:
+---------------------------------------- | STRING NUMERIC STRNUM +---------+------------------------------ | STRING | string string string | NUMERIC | string numeric numeric | STRNUM | string numeric numeric +---------+------------------------------
$2
输入的第一行应该为 type,因为看起来不像 awk 的数字,其余部分的 type 是因为所有其他值(例如 和 )看起来都像数字,但 awk 最初无法判断您是要将它们用作数字还是字符串。STRING
SRR1385501
STRNUM
0
8
根据上表,那么,()和()之间的比较类型应该是,并且这两个值不是同一个字符串,因此应该打印标题。其余的只是比较。SRR1385501
STRING
0
NUMERIC
string
STRNUM
NUMERIC
numeric
我建议获取新版本的 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
评论
awk 'FNR==1 || $2' my_file.txt
awk '{print NR, NF, "[" $0 "]"; for (i=1; i<=NF: i++) print "\t" i, "<" $i ">"} $2 != 0' my_file.txt | cat -A