如果多于一行具有相同的字符串,则删除所有行,除非首先使用unix

时间:2015-01-26 18:13:09

标签: linux shell unix

我有一个输入

Client=abc
Operation=123
Client=bcd
Operation=234
Operation=345
Operations=567
Client=def
Operation=789
Operation=892
Client=efg
Operation=991

我期待输出为

Client=abc
Operation=123
Client=bcd
Operation=234
Client=def
Operation=789
Client=efg
Operation=991

如果连续行中存在字符串匹配,则应删除除第一行之外的所有匹配行。 我试过awk'$ 1!= p {print; p = $ 1}'fileName,但没有任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用awk:

awk -F= '$1=="Client"{op=0} !op{print} $1=="Operation"{op=1}' file
Client=abc
Operation=123
Client=bcd
Operation=234
Client=def
Operation=789
Client=efg
Operation=991

<强>解释

  1. -F=将输入字段分隔符设置为=
  2. 当我们获得op
  3. 行时,将变量0设置为Client
  4. 如果op0,则打印记录,从而打印Client=行和Operation=
  5. 当我们获得第一个Operation=行时,我们设置op = 1

答案 1 :(得分:-1)

你看起来很好看也许你只需要将分隔符设置为&#34; =&#34;。

awk -F"="

编辑:测试了OP的脚本,但添加了-F&#34; =&#34;

awk -F"=" '$1!=p{print;p=$1}' fileName

得到了输出:

Client=abc
Operation=123
Client=bcd
Operation=234
Operations=567
Client=def
Operation=789
Client=efg
Operation=991

注意当人们认为第三次行动应该消失时,第三次行动是怎样的。 OP的输入有操作和操作......注意&#39;&#39;到底。因为那个&#39;该脚本将Operation与Operations分开......我认为这是正确的逻辑。也许&#39; s&#39;由OP错误地添加。你删除那个&#39; s&#39;然后你得到输出:

Client=abc
Operation=123
Client=bcd
Operation=234
Client=def
Operation=789
Client=efg
Operation=991