计算两条线之间的差异
calculate difference between 2 lines
我在 ksh / bash 中编写此脚本,当两行的输出不相等时需要打印标题 "Difference in count"。
文件名为test
fscsi0
fscsi0
fscsi0
fscsi0
fscsi1
fscsi1
fscsi1
然后:
cat test |awk '{b[]++}; END { for(a in b) printf("%25s %8d\n", a, b[a])}'
fscsi0 4
fscsi1 3
保留 OP 的过滤器,为什么不简单地将许多小工具堆叠成一条长管道?我们开始吧:
因为总是只有 2 个评估组来求和/计数行:
if [ "$(cat so_diff_line_grouped_sum.txt |awk '{b[]++}; END { for(a in b) printf("%25s %8d\n", a, b[a])}' | tr -s ' ' | cut -f 3 -d ' ' | uniq | wc -l | tr -d ' ')" -ne 1 ]; then printf "Difference in count\n"; fi
应该可以。输入 so_diff_line_grouped_sum.txt:
fscsi0
fscsi0
fscsi0
fscsi0
fscsi1
fscsi1
fscsi1
结果:
Difference in count
将一个条目 fscsi1 添加到文件并重新运行它没有输出。
我用bash,手边没有ksh ...
分为多行(为了便于阅读):
linecount="$(cat so_diff_line_grouped_sum.txt |\
awk '{b[]++}; END { for(a in b) printf("%25s %8d\n", a, b[a])}' |\
tr -s ' ' | cut -f 3 -d ' ' | uniq | wc -l | tr -d ' ')"
if [ $linecount != 1 ]
then printf "Difference in count\n"
fi
捡到
- OP的基础公式,
- 通过 tr,
将所有 spaces 相邻的 spaces 压缩为单个 spaces
- 然后使用 cut 来选择 space 分隔列的字段 3(计数)(我们在 fscsi* 字符串之前留下初始 space),
- 使用 uniq 评估每行是否不同,
- 用 wc 计算行数,
- 通过 tr 和
删除所有 space
- 将此与 1 进行比较
假设您无法更改现有程序:
... | awk 'p && p != { print "There is a difference!" }{p=}'
为什么不...
awk '{a[]++} END{n=asort(a); if(a[1]!=a[n]) print "Different!"}'
也可以处理两个以上的块。
我在 ksh / bash 中编写此脚本,当两行的输出不相等时需要打印标题 "Difference in count"。
文件名为test
fscsi0
fscsi0
fscsi0
fscsi0
fscsi1
fscsi1
fscsi1
然后:
cat test |awk '{b[]++}; END { for(a in b) printf("%25s %8d\n", a, b[a])}'
fscsi0 4
fscsi1 3
保留 OP 的过滤器,为什么不简单地将许多小工具堆叠成一条长管道?我们开始吧:
因为总是只有 2 个评估组来求和/计数行:
if [ "$(cat so_diff_line_grouped_sum.txt |awk '{b[]++}; END { for(a in b) printf("%25s %8d\n", a, b[a])}' | tr -s ' ' | cut -f 3 -d ' ' | uniq | wc -l | tr -d ' ')" -ne 1 ]; then printf "Difference in count\n"; fi
应该可以。输入 so_diff_line_grouped_sum.txt:
fscsi0
fscsi0
fscsi0
fscsi0
fscsi1
fscsi1
fscsi1
结果:
Difference in count
将一个条目 fscsi1 添加到文件并重新运行它没有输出。
我用bash,手边没有ksh ...
分为多行(为了便于阅读):
linecount="$(cat so_diff_line_grouped_sum.txt |\
awk '{b[]++}; END { for(a in b) printf("%25s %8d\n", a, b[a])}' |\
tr -s ' ' | cut -f 3 -d ' ' | uniq | wc -l | tr -d ' ')"
if [ $linecount != 1 ]
then printf "Difference in count\n"
fi
捡到
- OP的基础公式,
- 通过 tr, 将所有 spaces 相邻的 spaces 压缩为单个 spaces
- 然后使用 cut 来选择 space 分隔列的字段 3(计数)(我们在 fscsi* 字符串之前留下初始 space),
- 使用 uniq 评估每行是否不同,
- 用 wc 计算行数,
- 通过 tr 和 删除所有 space
- 将此与 1 进行比较
假设您无法更改现有程序:
... | awk 'p && p != { print "There is a difference!" }{p=}'
为什么不...
awk '{a[]++} END{n=asort(a); if(a[1]!=a[n]) print "Different!"}'
也可以处理两个以上的块。