awk命令问题识别分隔符

时间:2015-10-03 00:28:07

标签: linux macos awk

专家,为什么分隔符不适用于我的情况? '^ A'是一个真正的'^ A'字符串,而不是ASCII值1.

cat 2.txt
123^A9343784^A2207983400
45^A1270843^A66789439
67^A188285^A28075164
8^A91183^A27049564
9^A128589^A7283486
100^A84325^A7043462

cat 2.txt | awk -F'^A' '{print $1 }'
123^A9343784^A2207983400
45^A1270843^A66789439
67^A188285^A28075164
8^A91183^A27049564
9^A128589^A7283486
100^A84325^A7043462

BTW,在Mac OSX / Linux上工作。

提前谢谢, 林

1 个答案:

答案 0 :(得分:3)

编辑

Ed Morton 在评论区域中提出一些有效点之后,我更新了我的答案,以便对awk变种有关转义的不同行为提供更多见解。

我的理解是你想使用^A作为分隔符。

你必须逃避^角色,因为它与awk的正则表达式混淆*。 执行此操作的方法是将双转义序列\\添加到^

- Linux 中(awk通常是symlinkedmawkgawk,请参阅注意):

$ cat 2.txt | awk -F'\\^A' '{print $1 }' # mawk, gawk

现在,mawk对此有一个稍微放松的行为,因此仅使用\(单个转义)就可以获得相同的结果:

$ cat 2.txt | awk -F'\^A' '{print $1 }' # mawk (note the single backslash here)

但是,一般来说,这应该避免(特别是如果在脚本中使用或作为 passe partout one-liner - 可持续性出现在脑海中),因为其他 awk 变种会以不同的方式对待它,并且会发生各种不需要的结果(有些甚至在复杂情况下被伪装成合法的结果)

- Windows cygwin MinGW gnutils 提供{{ 1}}):

gawk

- OSX 中($ cat 2.txt | awk -F'\\^A' '{print $1 }' # gawk 默认为awk):

nawk

所有这些产量:

$ cat 2.txt | awk -F'\\^A' '{print $1 }' # nawk

* 您可以找到有关awk正则表达式的更多信息 here

注意

首先,要查找系统中可用的123 45 67 8 9 100 变体 你必须找到awk命令本身,然后使用awk跟随链接到实际的二进制文件,如下所示:

ls

(取自我的系统示例,Xubuntu 14.04)