删除文本文件中的重复行,每行有一个单词更改

时间:2015-12-01 22:36:19

标签: bash shell awk

somethingsame,somethingsame_usage,2015-11-30 01:00:00,0
somethingsame,somethingsame_usage,2015-11-30 02:00:00,0
somethingsame,somethingsame_usage,2015-11-30 03:00:00,0
somethingelse,somethingelse_usage,2015-11-30 01:00:00,0
somethingelse,somethingelse_usage,2015-11-30 02:00:00,0
somethingelse,somethingelse_usage,2015-11-30 03:00:00,0

我想删除行并拥有最终产品:

somethingsame,somethingsame_usage,2015-11-30 02:00:00,0
somethingelse,somethingelse_usage,2015-11-30 03:00:00,0

唯一改变的是时间(每个数据,即somethingsame与somethingelse)不同,但其他一切都是相同的。我保留哪条线/时间并不重要;我只想要一个。

4 个答案:

答案 0 :(得分:4)

如果您不关心输出行的顺序,可以使用sort(唯一)命令行标志-u执行此操作,该标志仅包含一个集合的一个实例独特的线条。

uniq不同,sort -u仅比较-k选项定义的行的部分,因此您可以精确指定哪些字段将作为唯一性测试的一部分进行计数。所以在这种情况下,您可以使用:

sort -u -t, -k1,2

其中-t,表示字段分隔符是逗号,-k1,2表示“键”包含从第一个字段中的第一个字符到第二个字段中的最后一个字符的所有内容。

请注意,-k参数是一个范围,而不是列表:-k1,3表示前三个字段,而-k2表示“从第二个字段到结尾线”。

答案 1 :(得分:2)

惯用awk解决方案如下

$ awk -F, '!a[$1]++' log

somethingsame,somethingsame_usage,2015-11-30 01:00:00,0
somethingelse,somethingelse_usage,2015-11-30 01:00:00,0

拿起第一个实例。

答案 2 :(得分:0)

以下解决方案使用awk,但它不是我的最爱(将在单独的答案中写出来)。

它做什么?

逐行,只是跟踪上一行的相关值(前两个字段,存储在变量previous1previous2中)。这些值在处理行结束时更新。

在找到当前值(current1current2)与之前值不同的行时,只需调用print $0即可打印整行。

我还将字段分隔符(FS值)配置为逗号。

您可以构建更精细的标准来确定两条线是否等于,以及新线是否需要打印。

这是完整的控制台转储:

$ cat input.txt 
somethingsame,somethingsame_usage,2015-11-30 01:00:00,0
somethingsame,somethingsame_usage,2015-11-30 02:00:00,0
somethingsame,somethingsame_usage,2015-11-30 03:00:00,0
somethingelse,somethingelse_usage,2015-11-30 01:00:00,0
somethingelse,somethingelse_usage,2015-11-30 02:00:00,0
somethingelse,somethingelse_usage,2015-11-30 03:00:00,0
$ awk 'BEGIN { FS="," } { current1 = $1; current2 = $2; if ((previous1 != current1) && (previous2 != current2)) { print $0 } previous1 = current1; previous2 = current2; }' input.txt
somethingsame,somethingsame_usage,2015-11-30 01:00:00,0
somethingelse,somethingelse_usage,2015-11-30 01:00:00,0
$ 

答案 3 :(得分:0)

这是使用uniq的不同解决方案,因为您的输入文件已经排序。

请注意,黑客是我简单地删除了该行的不相关部分,因此它不会出现在结果中:

$ cat input.txt
somethingsame,somethingsame_usage,2015-11-30 01:00:00,0
somethingsame,somethingsame_usage,2015-11-30 02:00:00,0
somethingsame,somethingsame_usage,2015-11-30 03:00:00,0
somethingelse,somethingelse_usage,2015-11-30 01:00:00,0
somethingelse,somethingelse_usage,2015-11-30 02:00:00,0
somethingelse,somethingelse_usage,2015-11-30 03:00:00,0
$ cat input.txt | awk 'BEGIN { FS = "," } { print $1 "," $2 }' | uniq
somethingsame,somethingsame_usage
somethingelse,somethingelse_usage
$