专家们,你们知道为什么分隔符在我的情况下不起作用吗?'^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
通常与mawk
或gawk
符号链接,参见注):
$ 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)