Uniqing基于字段子集的分隔文件

时间:2017-05-09 12:11:41

标签: linux bash shell awk uniq

我的数据如下:

1493992429103289,207.55,207.5
1493992429103559,207.55,207.5
1493992429104353,207.55,207.5
1493992429104491,207.6,207.55
1493992429110551,207.55,207.5

由于最后两列的性质,它们的值会在一天内发生变化,并且会定期重复它们的值。通过对我所需输出(下面)中概述的方式进行分组,我可以在每次值发生变化时查看(第一列中的enoch时间)。有没有办法实现下面显示的所需输出:

1493992429103289,207.55,207.5
1493992429104491,207.6,207.55
1493992429110551,207.55,207.5

所以我通过后两列整合数据。然而,合并并非完全独特(可以看出207.55,207.5重复)

我试过了:

uniq -f 1

但是输出只给出第一行而不是通过列表

下面的awk解决方案不允许先前发生的事件再次输出,因此给出输出(在awk代码下面):

awk '!x[$2 $3]++'

1493992429103289,207.55,207.5
1493992429104491,207.6,207.55

我不希望通过后两列对数据进行排序。但是,由于第一个是纪元时间,因此可以按第一列进行排序。

5 个答案:

答案 0 :(得分:2)

您可以使用Awk声明,如下所示

awk 'BEGIN{FS=OFS=","} s != $2 && t != $3 {print} {s=$2;t=$3}' file

根据需要生成输出。

1493992429103289,207.55,207.5
1493992429104491,207.6,207.55
1493992429110551,207.55,207.5

我们的想法是将第二和第三列值分别存储在变量st中,并仅在当前行唯一时打印内容

答案 1 :(得分:2)

您无法使用uniq设置分隔符,它必须是空格。在tr的帮助下,你可以

tr ',' ' ' <file | uniq -f1 | tr ' ' ','

1493992429103289,207.55,207.5
1493992429104491,207.6,207.55
1493992429110551,207.55,207.5 

答案 2 :(得分:1)

我找到了一个不像Inian那样优雅但满足我的目的的答案。 由于我的第一列始终是以微秒为单位的enoch时间,并且不会增加或减少字符,因此我可以使用以下uniq命令:

uniq -s 17

答案 3 :(得分:0)

您可以尝试手动(使用循环)将当前行与上一行进行比较。

{{1}}

答案 4 :(得分:0)

由于您的第一个字段似乎有18个字符的固定长度(包括,分隔符),因此您可以使用-s的{​​{1}}选项,这对于更大的文件:

uniq

给出这个输出:

uniq -s 18 file

来自1493992429103289,207.55,207.5 1493992429104491,207.6,207.55 1493992429110551,207.55,207.5

  

-f num

     

进行比较时忽略每个输入行中的第一个num字段。   字段是由空格与相邻字段分隔的一串非空字符。   字段编号是一个基础,即第一个字段是字段1。

     

-s chars

     

在进行比较时忽略每个输入行中的第一个字符字符。   如果与-f选项一起指定,则第一个字符后面的字符   第一个num字段将被忽略。字符数是一个基础,   即,第一个字符是第一个字符。