不可打印的字符不能识别为字段分隔符

时间:2019-01-11 02:47:18

标签: shell unix awk aix

我有一个文件。它的字段分隔符是不可打印字符\x1c(在Python中为chr(28))。在VI中,它看起来像a^\b^\c,但使用cat时,我只会看到abc。没有显示字段分隔符^\

我有一个简单的awk命令:

awk -F $’\x1c’ ‘{print NF}’ a

获取字段总数。它可在MacOS上运行,但在AIX上会失败。看来AIX无法识别字段分隔符。因此输出为1,这意味着整行被视为一个字段。 如何在AIX上执行此操作?任何想法都很感激。

3 个答案:

答案 0 :(得分:1)

Well $'\x1c' bashizm ,可移植格式是"$(printf '\034')"

(此答案已被写为评论。)

答案 1 :(得分:0)

awk遇到问题时,请尝试Perl

$ cat -vT tonyren.txt
a^\b^\c^\d
p^\q^\r^\s
x^\y^\z

$ perl -F"\x1c" -le ' { print scalar @F } ' tonyren.txt
4
4
3

$

答案 2 :(得分:0)

我能够在运行ksh的SOLARIS上重现此内容。

sol bash $ printf '\034a\034b\034c' | cat -v
^\a^\b^\c$
sol bash $ printf '\034a\034b\034c' | awk -F$'\x1c' '{print NF}'
4
sol bash $ printf '\034a\034b\034c' | awk -F$'\034' '{print NF}'
4

sol ksh $ printf '\034a\034b\034c' | cat -v
^\a^\b^\c$
sol ksh $ printf '\034a\034b\034c' | awk -F$'\x1c' '{print NF}'
1
sol ksh $ printf '\034a\034b\034c' | awk -F$'\034' '{print NF}'
1

我无法确认这是ksh还是awk问题,因为其他两种情况均无法解决。

sol ksh/bash $ printf '\034a\034b\034c' | awk 'BEGIN{FS="\034"}{print NF}'
1

以上所有情况在任何Linux系统(默认运行GNU awk)上均可成功运行,但似乎失败了。

以下技巧是一种完全不能失败的工作方法(直到失败为止):

sol ksh/bash $ printf '\034a\034b\034c' | awk 'BEGIN{FS=sprintf("%c",28)}{print NF}'
4

以上方法之所以有效,是因为我们使用sprintf函数通过awk设置了FS,并在其中传递了十进制数字28=x1c=034