Bash脚本 - 删除重复项

时间:2017-09-08 14:26:05

标签: linux bash

我需要从文件中提取名称并删除重复项。

output.txt的:

Server001-1
Server001-2
Server001-3
Server001-4
Server002-1
Server002-2
Server003-1
Server003-2
Server003-3

我需要输出如下。

Server001-1
Server002-1
Server003-1

因此,只为每个服务器组(Server00 *)打印第一台服务器,并删除该组中的其余服务器。

5 个答案:

答案 0 :(得分:0)

只需使用awk:

awk -F"-" '!a[$1]++'  Input_file

解释:将字段分隔符设置为 - 然后创建一个名为a的数组,其索引是当前行的第1个字段,并在此处检查条件!a [$ 1]表示它将检查如果当前行的第一个字段在数组a中没有任何存在,则执行该行的打印,然后++表示它将创建该特定行的第一个字段的出现值在数组中为1,所以下次不会打印该行。

答案 1 :(得分:0)

awk -F- 'dat[$1]=="" { dat[$1]=$0 } END { for (i in dat) {print dat[i]}}' filename

结果:

Server001-1
Server002-1
Server003-1

仅当该数组条目中没有其他条目时,创建一个数据,该数组键入存储整行的第一个以空格分隔的数据。这将确保仅存储第一个唯一条目。循环遍历数组并打印

答案 2 :(得分:0)

简单GNU datamash 解决方案:

datamash -t'-' -g1 first 2 <file
  • -t'-' - 字段分隔符

  • -g1 - 第1个字段的分组行

  • first 2 - 仅获取每个组的2个字段的第一个值。也可以更改为min 2操作

输出:

Server001-1
Server002-1
Server003-1

答案 3 :(得分:0)

由于您已将字符串格式提及为Server00*,因此您只需使用此格式:

grep -E "Server\d+-1" file

Server\d+用于案例Server1000,Server100000等

甚至

grep  '[-]1$' file

两者的输出:

Server001-1
Server002-1
Server003-1

答案 4 :(得分:0)

一种简单的方法只需1个命令行即可获得一般的唯一结果:

nin output.txt nul "^(\w+)-\d+" -u -w

说明:

  • nul是一个不存在的Windows文件,如Linux上的/dev/null
  • -u获取唯一结果,-w输出整行。无视案例?使用-i
  • "^(\w+)-\d+"C++ / C# / Java / Scala等中的Regex语法相同。
  • 保存到文件? nin output.txt nul "^(\w+)-\d+" -u -w > result.txt
  • 使用摘要信息保存到文件? nin output.txt nul "^(\w+)-\d+" -u -w -I > result.txt
  • nin.exe的未来自动化:结果计数=返回值%ERRORLEVEL%

nin.exe / nin.gcc*是一个便携式exe工具,用于在2 files或{之间获得差异交叉点键/行{1}}。请参阅我https://github.com/qualiu/msr的开放项目a pipe and a file目录。 您还可以看到丰富多彩的内置用法/示例:https://qualiu.github.io/msr/usage-by-running/nin-Windows.html

Get unique key set or line set