首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用bash命令在第一行中找到唯一的单词数?

如何使用bash命令在第一行中找到唯一的单词数?
EN

Ask Ubuntu用户
提问于 2022-05-21 04:11:54
回答 1查看 1.7K关注 0票数 2

我希望在名为cdj.tsv的文件中找到唯一的单词数。我可以使用head -n 1 cdj.tsv获得第一行。现在我要在这一行中有几个独特的单词。我怎么能拿到呢?命令head -n 1 cdj.tsv的结果如下所示:

代码语言:javascript
复制
Country China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   China   Denmark Denmark Denmark Denmark Denmark DenmarkDenmark  Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark DenmarkDenmark  Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark DenmarkDenmark  Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark DenmarkDenmark  Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark Denmark DenmarkDenmark  Denmark

所以,我希望产量是3(国家,中国和丹麦)。

谢谢

EN

回答 1

Ask Ubuntu用户

发布于 2022-05-22 04:36:39

代码语言:javascript
复制
 head -q -n 1 *.tsv | tr -s '[:space:]' '\n' | sort -u | tee /dev/tty | wc -l

tr -s characters \n是将空白分隔成不同行的好方法。任意数量的空白字符都被压缩(tr -s)到一个换行符。

如果还想删除前导空格(在第一个单词之前),可以使用sed对两个单独的-e操作进行操作,一个操作用于该操作,另一个操作用于压缩以后的空白。-E是扩展正则表达式

代码语言:javascript
复制
... | sed -E -e 's/^[[::space:]]+// -e 's/[[:space:]]+/\n/g' | ...

或者将tee使用到终端(这会干扰将整个事情重定向到一个文件),@Raffa的回答建议使用| (tee >(wc -l))进程替换。(但不知道为什么tee本身必须在子subshell中。)

更有效的版本只需在awkperl中使用直方图,而不是通过多个进程进行排序-唯一,然后计数。另外两个答案显示了如何做到这一点。

不过,Raffa回答的另一部分并不是一般使用的好建议。在某些情况下,xargs -n 1 (使用其默认的echo命令)可以作为tr的替代方法,但速度要慢得多(对于每个单词都是整个进程的fork/exec)。

更糟糕的是,GNU echo-n-e,所以如果你的文本包含这些“单词”,它就不健壮。例如,

代码语言:javascript
复制
echo -e 'foo \t  -n \n\n bar\n\n\nbaz' |  tr -s '[:space:]' '\n' | sort -u | tee /dev/tty | wc -l
bar
baz
foo
-n
4
代码语言:javascript
复制
# this version loses the -n
echo -e 'foo \t  -n \n\n bar\n\n\nbaz' |  xargs -n 1 | sort -u | tee /dev/tty | wc -l
bar
baz
foo
3

xargs -n 1黑客还将您的数据以命令行args的形式公开给其他用户,如果他们在正确的时间运行它,他们可以通过ps auxw看到这些数据。(例如,在循环中,或者通过监视/proc来获取新PID的命令行args )。

如果你不关心小数据集的效率,并发现它更容易进行交互使用,你可以使用它,如果你愿意,但这是对xargs的S调试特性的怪异滥用,默认为echo,而不是一个有意义的命令。这绝对不是你想要放在脚本中的东西;如果你要花时间写一个脚本,那么如果你只需要几秒钟的时间来键入或提醒自己一个男人页面的意思,就可以使用一些健壮高效的东西。

它确实有一个好处就是忽略了前面的空格。

票数 1
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1409751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档