计算两条线之间的差异

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

捡到

  1. OP的基础公式,
  2. 通过 tr,
  3. 将所有 spaces 相邻的 spaces 压缩为单个 spaces
  4. 然后使用 cut 来选择 space 分隔列的字段 3(计数)(我们在 fscsi* 字符串之前留下初始 space),
  5. 使用 uniq 评估每行是否不同,
  6. 用 wc 计算行数,
  7. 通过 tr 和
  8. 删除所有 space
  9. 将此与 1 进行比较

假设您无法更改现有程序:

... | awk 'p && p !=  { print "There is a difference!" }{p=}'

为什么不...

awk '{a[]++} END{n=asort(a); if(a[1]!=a[n]) print "Different!"}'

也可以处理两个以上的块。