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

顺便说一下,在Mac OSX/Linux上工作。

提前感谢,林

EDIT

Ed Morton在评论区提出了一些有效的观点之后,我更新了我的答案,以提供更多关于awk变体在转义方面的不同行为的见解。


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

您必须转义^字符,因为它与awk的regex*混淆。要做到这一点,方法是将双转义序列\添加到^


-Linux (awk通常与mawkgawk符号链接,参见注):

$ 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)
但是,一般情况下,应该避免(特别是在脚本中使用或作为传递partout一行代码使用时-想到可移植性-),因为其他awk变体将以不同的方式处理此问题,并且会出现各种不想要的结果(有些甚至在复杂情况下伪装成合法的结果)

- Windows ( cygwin , MinGW , gnutils 提供gawk):

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

- OSX (默认情况下nawk awk):

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

所有这些产生:

123
45
67
8
9
100

*你可以在这里找到更多关于awk正则表达式的信息。


注意

为了找到awk的哪个变体在您的系统中可用,首先您必须找到awk命令本身,然后使用ls按照链接链找到实际的二进制文件,如下所示:

$ which awk
/usr/bin/awk
$ ls -l /usr/bin/awk
lrwxrwxrwx 1 root root ... /usr/bin/awk -> /etc/alternatives/awk
$ ls -l /etc/alternatives/awk
lrwxrwxrwx 1 root root ... /etc/alternatives/awk -> /usr/bin/mawk

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

相关内容

  • 没有找到相关文章

最新更新