我输入如下所示,如果两行之间的第三列的值不同,我需要在行之间放置一个分隔符。
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
答案 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
关键字将跳过所有行的第二个操作。