我的数据如下:
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
我不希望通过后两列对数据进行排序。但是,由于第一个是纪元时间,因此可以按第一列进行排序。
答案 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
我们的想法是将第二和第三列值分别存储在变量s
和t
中,并仅在当前行唯一时打印行内容
答案 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字段将被忽略。字符数是一个基础, 即,第一个字符是第一个字符。