我在 cygwin 中编写临时 awk 命令来处理制表符分隔的文件。几乎每个命令都以:
BEGIN {FS="\t";OFS="\t";ORS="\r\n";}
如何将这些分隔符设为默认值以避免每次都输入它们?
答案1
也许最简单的方法是使用 shell 别名(将其添加到~/.bashrc
shell 或等效的 shell 中):
alias awktab="awk -v FS='\t' -v OFS='\t' -v ORS='\t'"
答案2
您还可以为其添加快捷方式。例如,要将Ctrl+G插入awk -v FS='\t' -v OFS='\t' -v ORS='\t'
到您的终端中,请将此行添加到您的~/.inputrc
:
Control-G: "awk -v FS='\t' -v OFS='\t' -v ORS='\t'"
然后,打开一个新终端,输入Ctrl+G并立即!
答案3
由于 POSIX 定义了什么特殊变量默认值是,简单的选项是在运行时覆盖它们(不简单的选项是更改源)。
在这种情况下,gawk
您可以将通用代码(通常在BEGIN {}
块内)放入库文件中。如果将它们放置在默认库路径(可能是/usr/share/awk/
或/usr/local/share/awk
)中,或者环境变量AWKPATH
指向的位置,则不需要使用完整路径:
gawk -f tabfile.awk [...]
与其他 awks 不同,gawk
它允许多个选项,并允许您在命令行上-f
混合使用两者和程序源。-f
最新版本支持额外的-i
包含文件选项(自 gawk-4.1.0 起)和@include
指令(自 4.0.x AFAICT 起)。这是一个稍微更健壮和友好的版本-f
:
gawk '@include "tabfile"; /foo/ { ... }'
上面将包含tabfile.awk
来自AWKPATH
或默认的库路径。@include
已经支持很长时间了,但是通过igawk
shell 脚本包装器gawk
,它现在是 gawk 的一个功能。
这与其他两个很好的答案兼容,例如:
alias awktab="gawk -i tabfile"
-v
使用此库文件方法和在命令行上使用之间有一个细微的区别:命令行选项在任何 awk 代码运行之前生效,因此它们是在库代码运行时设置的。如果库代码使用此类变量(例如读取数据文件),这可能很重要。