我有一个分隔的文件,用八进制\ 036或十六进制值1e分隔。
我需要使用bash shell脚本计算每行的分隔符数。
我试图使用awk,不确定这是否是最佳方式。
示例输入(|是\ 036的表示)
Example|Running|123|
预期产出:
3
答案 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