我需要从文件中提取名称并删除重复项。
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 *)打印第一台服务器,并删除该组中的其余服务器。
答案 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