为什么awk脚本在Linux上能运行,但在Mac OS上却不能?

26

我有一个awk脚本,用于过滤差异表达的基因。我有一个在R中创建的csv文件。

 #Command to get DE genes
awk -F '\t' '$14 < 0.05 && $10 < -1 && $7 > 1 { print > "Genes-Down.csv" }
             $14 < 0.05 && $10 > +1 && $8 > 1 { print > "Genes-Up.csv" }' Results-RPKMs.csv

我现在开始在Mac OS上进行所有的分析,但是相同的命令不起作用。它也没有给出任何错误信息。运行后什么也没有发生。我在其他sed命令中也遇到了同样的问题,但使用awk很容易解决。


更新: MacOS X的awk版本是20070501。然而,Ubuntu机器有mawk 1.3.3。命令awk --version不能工作。必须使用awk -W --version。所以我想这就是为什么它在Ubuntu上起作用但在MacOSX上无法工作的原因。所以我下载了mawk并使用fink安装了它,现在该命令在MacOSX上可以工作了。谢谢你的帮助。

更新2:实际上问题不是在awk上。通常我会在R中创建csv文件,然后运行脚本进行过滤。结果发现,如果我在Excel中打开csv文件或将Excel文件保存为csv格式,则该脚本将无法工作(尝试了几次使用不同的分隔符)。显然,如果您在MacOX(Excel 2011)中将电子表格另存为.csv,并尝试在Excel中将其打开,则会显示它是SYLK文件。Microsoft网站上有对此的描述。如果我使用OpenOffice,一切都能正常工作。


尝试将 && 分组为 ($14 < 0.05 && $10 < -1) && $7 > 1 - Avinash Raj
3
请问您需要翻译的内容是:"cat -vet "Results-RPKMs.csv | head -10"。如果您在每行末尾看到了 "^M$",请运行命令 "dos2unix Results-RPKMs.csv",否则请在问题编辑中包含两台计算机上的 "awk --version" 命令结果。请注意,翻译过程中不能添加解释或其他非翻译内容。祝好运!" - shellter
1
我刚刚在 MacOS X 上尝试了您的脚本,使用的是 BSD awk 版本 20070501,它和 mawk、gawk 一样顺利地运行了。 - Scrutinizer
1
FYI,mawk是一个最小化特性的awk,削减了一些其他awk的运行速度来帮助它运行得更快。您最好安装功能丰富的、符合POSIX标准的gawk。 - Ed Morton
2个回答

39

我也遇到了同样的问题。通过brew在OSX 10.11.2上安装gawk解决了我的问题。

~$ brew install gawk
~$ gawk --version | head -n 1
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.4-p1, GNU MP 6.1.1)
~$

2
我也试过了,可以用。 - Marcus Rådell
1
然后在您的~/.zprofile~/.bash_profile中添加alias awk="gawk" - Josh Hibschman

29

同样的命令名称并不意味着它是相同的命令。大多数基本命令都有不同的实现方式,AWK就是一个例子,但几乎所有GNU core utils在BSD许可证下都有相应的替代品。你应该小心使用GNU sedBSD sed,这也是一个陷阱。

事实上,Linux通常使用gawkmawk

$ man awk
mawk - pattern scanning and text processing language

Mac OS 通常使用 nawk

$ man awk
awk - pattern-directed scanning and processing language

查看此页面,了解更多关于AWK实现的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接