标签: uniq

为什么uniq!如果没有重复,则返回nil

我刚开始使用Ruby,我个人发现以下内容违反了"最少惊喜原则".也就是说,引用文档,那就是uniq!"从self中删除重复的元素.如果没有进行任何更改,则返回nil(即没有找到重复项)."

任何人都能解释一下,这对我来说似乎完全违反直觉吗?这意味着,而不是通过附加.uniq来编写下面的一行代码!要结束第一行,我必须编写以下两行:

  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  hooks = hooks.uniq
Run Code Online (Sandbox Code Playgroud)

或者我错过了什么,更好的方法?

编辑:

我明白uniq!修改其操作数.以下是我希望更好地说明的问题:

  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  puts hooks.length #50
  puts hooks.uniq!.length #undefined method `length' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

我认为uniq的方式!作品使它完全无意义和无用.在我的情况下,我指出我可以将.uniq附加到第一行.但是后来在同一个程序中,我将元素推送到循环内的另一个数组中.然后,在循环下,我想"删除"数组,但我不敢写'hooks_tested.uniq!' 因为它可以返回零; 相反,我必须写hooks_tested = hooks_tested.uniq

事实上,我认为这是一个特别令人震惊的错误特征,因为它是一个众所周知的原则,当设计一个返回数组的方法时,应该总是至少返回一个空数组,而不是nil

ruby arrays uniq

11
推荐指数
2
解决办法
2568
查看次数

更改uniq命令的分隔符

我想将uniq命令的输出以逗号分隔,以便代替:

     30 hello
     31 world
     36 hey_there
    142 i_am_bigest
Run Code Online (Sandbox Code Playgroud)

我去拿:

30,hello
31,world
36,hey_there
142,i_am_biggest
Run Code Online (Sandbox Code Playgroud)

我的输入没有空格,但只是使用sedtr可能是一个问题,因为前导空格的数量根据计数中的小数位数而变化.

uniq

11
推荐指数
1
解决办法
7983
查看次数

打印文件中没有重复项的行并保留排序顺序 linux

我有以下文件:

2
1
4
3
2
1
Run Code Online (Sandbox Code Playgroud)

我想要这样的输出(没有任何重复项并保留顺序的唯一行):

4
3
Run Code Online (Sandbox Code Playgroud)

我尝试过sort file.txt | uniq -u它有效,但输出已排序:

3
4
Run Code Online (Sandbox Code Playgroud)

我尝试awk '!x[$0]++' file.txt保持顺序,但它会打印一次所有值:

2
1
4
3
Run Code Online (Sandbox Code Playgroud)

awk uniq

11
推荐指数
3
解决办法
280
查看次数

如何选择独特的元素

我想Array用一个uniq_elements方法来扩展该类,该方法返回多个为1的元素.我也想在我的新方法中使用闭包uniq.例如:

t=[1,2,2,3,4,4,5,6,7,7,8,9,9,9]
t.uniq_elements # => [1,3,5,6,8]
Run Code Online (Sandbox Code Playgroud)

关闭示例:

t=[1.0, 1.1, 2.0, 3.0, 3.4, 4.0, 4.2, 5.1, 5.7, 6.1, 6.2]
t.uniq_elements{|z| z.round} # => [2.0, 5.1]
Run Code Online (Sandbox Code Playgroud)

既不工作t-t.uniq也不t.to_set-t.uniq.to_set工作.我不关心速度,我在程序中只调用一次,所以它可能很慢.

ruby arrays uniq

9
推荐指数
1
解决办法
1421
查看次数

Unix uniq 命令到 CSV 文件

我有一个文本文件(list.txt),其中包含单个和多个单词的英语短语。我的目标是对每个单词进行字数统计并将结果写入 CSV 文件。

我已经弄清楚了写入每个单词的唯一实例数量的命令,按从最大到最小的顺序排序。该命令是:

$ tr 'A-Z' 'a-z' < list.txt | tr -sc 'A-Za-z' '\n' | sort | uniq -c | sort -n -r | less > output.txt
Run Code Online (Sandbox Code Playgroud)

问题在于新文件(output.txt)的格式化方式。前导有 3 个空格,后面是出现次数,后面是一个空格,最后是单词。然后转到下一行。例子:

   9784 the
   6368 and
   4211 for
   2929 to
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能以更理想的格式(例如 CSV)获得结果?例如,我希望它是:

9784,the
6368,and
4211,for
2929,to
Run Code Online (Sandbox Code Playgroud)

更好的是:

the,9784
and,6368
for,4211
to,2929
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 Unix 命令来执行此操作,或者我是否需要在文本编辑器或 Excel 中进行一些后处理?

unix csv bash uniq

8
推荐指数
1
解决办法
5288
查看次数

使用sed删除bash中的空格

我有一个文件,其中包含一个数字,后面是每行的文件路径,用于存储大量文件.所以它看起来像这样:

      7653 /home/usr123/file123456
Run Code Online (Sandbox Code Playgroud)

但问题是它之前有6个空白空格,它会抛弃我脚本的其余部分.我在下面列出了产​​生它的线:

cat temp | uniq -c | sed 's/  */ /g' > temp2
Run Code Online (Sandbox Code Playgroud)

我把它缩小到uniq产生不必要的空白区域的命令.我试图实现一个sed命令来删除空格,但由于某种原因,它删除除了一个以外的所有空格.我怎样才能修改我的sed陈述或我的uniq陈述以摆脱这些空格?任何帮助将不胜感激!

unix bash whitespace sed uniq

8
推荐指数
1
解决办法
2万
查看次数

“ uniq”后的“ sort”中出现“ is not numeric”错误

use List::MoreUtils 'uniq';
print join ", ", sort uniq ("b", "a", "a");
Run Code Online (Sandbox Code Playgroud)

导致参数“ a”在排序时不是数字...

print join ", ", uniq sort ("b", "a", "a");
Run Code Online (Sandbox Code Playgroud)

可以正常工作。

print join ", ", sort {$a cmp $b} uniq ("b", "a", "a");
Run Code Online (Sandbox Code Playgroud)

也可以工作-但是第一个示例有什么问题?

sorting perl uniq

8
推荐指数
1
解决办法
96
查看次数

如何基于列排序,但基于另一列的uniq?

他,我有一个文件有一些列.我想对第2列进行排序,然后对第1列应用uniq.我发现这篇文章谈论了同一列的sort和uniq,但我的问题有点不同.我正在考虑使用一些东西sort,uniq但不知道如何使用.谢谢.

linux sorting uniq

7
推荐指数
1
解决办法
2万
查看次数

为列的每个唯一值输出整行一次(Bash)

这肯定是一项微不足道的任务awk或其他方面,但它让我今天早上挠头.我有一个格式与此类似的文件:

pep> AEYTCVAETK     2   genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK        1   genes ADUm.1999,ADUm.3560
pep> AIQLTGK        8   genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR  5   genes ADUm.367
pep> VSSILEDKTT     9   genes ADUm.1192,ADUm.2731
pep> AIQLTGK        10  genes ADUm.1999,ADUm.3560
pep> VSSILEDKILSR   3   genes ADUm.2146,ADUm.5750
pep> VSSILEDKILSR   2   genes ADUm.2146,ADUm.5750
Run Code Online (Sandbox Code Playgroud)

我想在第2列中为每个不同的肽值打印一行,这意味着上面的输入将成为:

pep> AEYTCVAETK     2   genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK        1   genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR  5   genes ADUm.367
pep> VSSILEDKTT     9   genes ADUm.1192,ADUm.2731
pep> VSSILEDKILSR   3   genes ADUm.2146,ADUm.5750
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的,但显然我也不需要:

awk '{print $2}' file | sort | uniq
# Prints …
Run Code Online (Sandbox Code Playgroud)

bash shell awk uniq

7
推荐指数
2
解决办法
5138
查看次数

更改 uniq -c 输出的简单方法?

我有一个像这样的简单文件:

Term1 column2 column3 Term2
column2 column3
Term3 column2 column3 Term2
column2 column3
Term1 column2 column3
Term2 column2 column3

如果我对第一列进行排序并计算术语:

cut -f1 -d ' ' file | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

结果告诉我这个:

    2     学期 1
    3
学期2 1 学期3

但我更愿意看到这个:

学期 1 2学期2
3
学期3 1

是否有一种简单的方法可以“更改” uniq 输出来执行此操作,或者我仍然需要将输出通过管道传输到 sed 或 awk 才能获得此结果?

这似乎是一个简单的问题,所以如果之前有人问过这个问题,我深表歉意。

sorting shell awk sed uniq

7
推荐指数
1
解决办法
680
查看次数

标签 统计

uniq ×10

awk ×3

bash ×3

sorting ×3

arrays ×2

ruby ×2

sed ×2

shell ×2

unix ×2

csv ×1

linux ×1

perl ×1

whitespace ×1