计算2行之间的差异

时间:2016-06-10 14:32:57

标签: bash awk ksh

我在ksh / bash中编写此脚本并需要打印标题"计数差异"当两条线的输出不相等时。

文件名是test

fscsi0
fscsi0
fscsi0
fscsi0
fscsi1
fscsi1
fscsi1

然后:

cat test |awk '{b[$1]++}; END { for(a in b) printf("%25s %8d\n", a, b[a])}'
     fscsi0        4
     fscsi1        3

3 个答案:

答案 0 :(得分:0)

保持OP的过滤器,为什么不简单地将大量小工具堆叠到长管道中?我们走了:

因为总是只有2个评估组来汇总/计算行数:

if [ "$(cat so_diff_line_grouped_sum.txt |awk '{b[$1]++}; 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[$1]++}; 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. 将邻近空格的所有空格挤压到单个空格中
  4. 然后使用cut来选择空格分隔列的字段3(计数)(我们在fscsi *字符串之前留下初始空格),
  5. 使用uniq来评估每行是否不同,
  6. 用wc计算行数,
  7. 通过tr和
  8. 删除所有空格
  9. 将此与1
  10. 进行比较

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

为什么不呢......

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

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