我刚开始使用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
我想将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)
我的输入没有空格,但只是使用sed或tr可能是一个问题,因为前导空格的数量根据计数中的小数位数而变化.
我有以下文件:
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) 我想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工作.我不关心速度,我在程序中只调用一次,所以它可能很慢.
我有一个文本文件(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 中进行一些后处理?
我有一个文件,其中包含一个数字,后面是每行的文件路径,用于存储大量文件.所以它看起来像这样:
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陈述以摆脱这些空格?任何帮助将不胜感激!
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)
也可以工作-但是第一个示例有什么问题?
他,我有一个文件有一些列.我想对第2列进行排序,然后对第1列应用uniq.我发现这篇文章谈论了同一列的sort和uniq,但我的问题有点不同.我正在考虑使用一些东西sort,uniq但不知道如何使用.谢谢.
这肯定是一项微不足道的任务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) 我有一个像这样的简单文件:
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 才能获得此结果?
这似乎是一个简单的问题,所以如果之前有人问过这个问题,我深表歉意。