Unix Shell中特殊字符的计数

时间:2017-12-06 15:55:05

标签: bash shell unix awk hex

我有一个分隔的文件,用八进制\ 036或十六进制值1e分隔。

我需要使用bash shell脚本计算每行的分隔符数。

我试图使用awk,不确定这是否是最佳方式。

示例输入(|是\ 036的表示)

Example|Running|123|

预期产出:

3

6 个答案:

答案 0 :(得分:3)

awk -F'|' '{print NF-1}' file

|更改为您喜欢的任何分隔符。如果您的文件可以有空行,那么您需要将其调整为:

awk -F'|' '{print (NF ? NF-1 : 0)}' file

答案 1 :(得分:1)

你可以尝试

awk '{print gsub(/\|/,"")}'

答案 2 :(得分:0)

只需尝试

awk -F"|" '{print substr($3,length($3))}' OFS="|"   Input_file

说明: 将字段分隔符-F设为|,然后按照您的$3打印第3列需要。然后将OFS(输出字段分隔符)设置为|。最后在这里提到Input_file名称。

答案 3 :(得分:0)

据我所知,这将有效。

echo "Example|Running|123|" | tr -cd '|' | wc -c

输出

3

答案 4 :(得分:0)

Awk可能不是最好的工具。 Gnu grep有一个很酷的-o选项,可以在一个单独的行上打印每个匹配的模式。然后,您可以计算为每个输入行生成的匹配行数,以及分隔符的数量。例如。 (其中文件中的^^实际上是十六进制1e)

$ cat -v i
a^^b^^c
d^^e^^f^^g

$ grep -n -o $'\x1e' i | uniq -c
      2 1:
      3 2:

如果您删除uniq -c,您可以看到它是如何工作的。你会得到" 1"打印两次,因为第一行有两个匹配的图案。或者尝试使用一些常规的ascii字符,并且-o和-n选项正在做的事情变得更加清晰。

如果您要打印行号,然后打印该行的字段数,请执行以下操作:

$grep -n -o $'\x1e' i | tr -d ':' | uniq -c | awk '{print $2 " " $1}'
1 2
2 3

这假设文件中的每一行都包含至少一个分隔符。如果情况并非如此,那么另一种方法也可能更快:

$ tr -d -c $'\x1e\n' < i | awk '{print length}'
2
3
0
0
0

这使用tr删除(-d)所有不是(-c)1e或\ n的字符。然后它将该数据流传输到awk,它只计算每行剩余的字符数。如果您想要行号,请添加&#34; | cat -n&#34;到最后。

答案 5 :(得分:0)

这应该适合你:

awk -F '\036' '{print NF-1}' file

3

-F '\036'将输入字段分隔符设置为八进制值036