如果值或两个连续行与列不匹配,如何打印分隔符

时间:2018-01-30 13:03:01

标签: bash awk

我输入如下所示,如果两行之间的第三列的值不同,我需要在行之间放置一个分隔符。

one two three four
five six three seven
eight nine ten elevel
alpha beta ten gama
tango charlie oscar bla

预期结果:

one two three four
five six three seven
=
eight nine ten elevel
alpha beta ten gama
=
tango charlie oscar bla

这是我认为可行的但不是。

awk '{col3=$3;next} $3!=col3{$0="\n="$0;print $0}' input

5 个答案:

答案 0 :(得分:9)

$ awk '$3!=p && NR>1 { print "=" } { print; p=$3 }' file
one two three four
five six three seven
=
eight nine ten elevel
alpha beta ten gama
=
tango charlie oscar bla

答案 1 :(得分:5)

Awk中补充James's answer的另一种变体(或者说是相同的?用不同的方式写成),

awk '{ if ($3 != old && NR>1) { print "=" } print; old = $3; }' file

这个想法基本上是从每一行备份$3,基本上如果它在下一个打印中变化所需的字符串。 NR>1只是跳过第一行打印的条件。

答案 2 :(得分:5)

$ awk 'p!=$3{if(NR>1)print "="; p=$3}1' file 
one two three four
five six three seven
=
eight nine ten elevel
alpha beta ten gama
=
tango charlie oscar bla

答案 3 :(得分:4)

关注awk也可以帮助您。

解决方案1: 通过条件检查并在其中包含prev变量:

awk 'prev!=$3 && prev{print "="} 1; {prev=$3}'  Input_file

解决方案第二: ,使用printf并检查条件。

awk '{printf("%s%s",prev!=$3 && prev?"=" RS $0:$0,RS);prev=$3}' Input_file

答案 4 :(得分:2)

我要补充说,初始解决方案的问题如下:

{
  col3=$3;
  next;
}

由于这是第一个操作,因此对于每一行,变量col3都将设置为字段3,之后next关键字将跳过所有行的第二个操作。