我有一个文件。它的字段分隔符是不可打印字符\x1c
(在Python中为chr(28)
)。在VI中,它看起来像a^\b^\c
,但使用cat
时,我只会看到abc
。没有显示字段分隔符^\
。
我有一个简单的awk命令:
awk -F $’\x1c’ ‘{print NF}’ a
获取字段总数。它可在MacOS上运行,但在AIX上会失败。看来AIX无法识别字段分隔符。因此输出为1
,这意味着整行被视为一个字段。
如何在AIX上执行此操作?任何想法都很感激。
答案 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