【发布时间】:2017-12-06 15:55:04
【问题描述】:
我有一个由八进制 \036 或十六进制值 1e 分隔的分隔文件。
我需要使用 bash shell 脚本计算每行的分隔符数量。
我尝试使用 awk,不确定这是否是最好的方法。
样本输入(| 是 \036 的表示)
Example|Running|123|
预期输出:
3
【问题讨论】:
我有一个由八进制 \036 或十六进制值 1e 分隔的分隔文件。
我需要使用 bash shell 脚本计算每行的分隔符数量。
我尝试使用 awk,不确定这是否是最好的方法。
样本输入(| 是 \036 的表示)
Example|Running|123|
预期输出:
3
【问题讨论】:
awk -F'|' '{print NF-1}' file
将| 更改为您喜欢的任何分隔符。如果您的文件可以有空行,那么您需要将其调整为:
awk -F'|' '{print (NF ? NF-1 : 0)}' file
【讨论】:
echo "" | awk '{print NF}' 输出 0,因为空行没有字段,因此字段数为零。如果该行仅包含空格并且您使用的是默认 FS(一个空白字符),情况也是如此,因为使用默认 FS 进行字段拆分会在将记录拆分为字段之前去除前导和尾随空白,并且显然没有任何剩余-删除前导/尾随空格后的空白行。
你可以试试
awk '{print gsub(/\|/,"")}'
【讨论】:
试一试
awk -F"|" '{print substr($3,length($3))}' OFS="|" Input_file
解释: 将字段分隔符-F 设为|,然后根据您的需要通过$3 打印第三列。然后将OFS(输出字段分隔符)设置为|。最后在这里提到 Input_file 名称。
【讨论】:
据我所知,这将起作用
echo "Example|Running|123|" | tr -cd '|' | wc -c
3
【讨论】:
这应该适合你:
awk -F '\036' '{print NF-1}' file
3
-F '\036' 将输入字段分隔符设置为八进制值036
【讨论】:
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,它只计算每行剩余的字符数。如果你想要行号,在末尾添加“| cat -n”。
【讨论】: