由于项目经历原因,经常使用awk处理一些文本数据。甚至,我特意下载了一个windows上的awk:gawk.exe,这样在windows上也能享受awk处理数据的方便性,。
俗话说,“常在河边走,哪能不湿鞋”,使用awk过程中碰上过不少坑,这里稍总结一下,希望对大家有帮助。
1 FS问题
看看这两个awk脚本:
cat demo_1.txt demo_2.txt 1|2|3|4| 1|@|2|@|3|@|4|@| awk -F '|' '{print $2}' demo_1.txt; # 脚本1 awk -F '|@|' '{print $2}' demo_2.txt; # 脚本2
脚本原目的是达到的目的是分别按'|'和分隔'|@|',输出demo.txt第二列。但实际上,第一个脚本这样写没错,但第二个脚本却是错的。
为什么呢?
因为竖线在正则表达式中是一个特殊字符,表示匹配竖线左右的字符组之一。如果想使用竖线本身,需要对用转义符。
但为什么第一个命令也一样使用了竖线却没有问题呢?
这就涉及到awk在一个规定:
如果FS设置了不止一个字符作为字段分隔符,将作为一个正则表达式来解释,否则直接按该字符做为分隔符对每行进行分割。
所以第一个命令使用了竖线做分隔符没问题,第二个命令就出错了。
2 正则表达式与反斜杠号问题
继续上面的问题讨论,如果demo.txt是按"|@|"做为分隔符的,要输出demo.txt第二列,正确的答案应该是怎么写呢?
答案是:
awk -F '\\|@\\|' '{print $2}' demo.txt;
注意这里,FS的值是'\\|@\\|',而不是简单的'\|@\|'(这样写会报错,提示:awk: 警告: 转义序列“\|”被当作单纯的“|”)。为啥要这样写呢?
先来看一个试验:
echo|awk -F '|@|' '{print FS}' # 脚本1 echo|awk -F '