使用管道命令在Bash中获取特定的输出

时间:2018-10-10 04:49:36

标签: bash

我正在学习编程课程,正在尝试进行练习活动,但被卡住了。我有一个包含以下列表的文件:

Monday       day
Tuesday      day
Easter       holiday
Monday       day
christmas    holiday
Tuesday      day
Friday       day
Thursday     day
thanksgiving holiday

我想做的是

  1. 对该列表进行排序
  2. 打印仅包含不重复名称的新列表,
  3. 计算每个单词在列表中出现的次数,并且
  4. 在计数器和单词之间插入一个制表符。

这将是我想要的输出:

1    christmas    holiday
1    Easter       holiday
1    Friday       day
2    Monday       day
1    thanksgiving holiday
1    Thursday     day
2    Tuesday      day

我尝试使用以下代码行:

cat my_file | sort | uniq -c | less

我的问题是单词没有真正排序,因为以大写字母开头的单词会比以小写字母开头的单词先出现。另外,我也不知道如何在数字和单词之间添加制表符(在我的输出中,它们之间只有一个空格)。

你能帮我吗?

1 个答案:

答案 0 :(得分:2)

您可以使用-f对不区分大小写的单词进行排序,并用sed(1)将制表符替换为空格。 cat将从管道中删除:

sort -f my_file | uniq -c | sed $'s/  */\t/g' | less

注意:sed参数前面的美元符号将\t解释为制表符,而不是\t

如果每行中的第一个标签令人讨厌,您也可以使用sed将其删除:

sort -f my_file | uniq -c | sed 's/^ *//' | sed $'s/  */\t/g' | less

这将产生:

1   christmas   holiday
1   Easter  holiday
1   Friday  day
2   Monday  day
1   thanksgiving    holiday
1   Thursday    day
2   Tuesday day

最后,如果要在第二列和第三列之间保留空格,则应从第二个{{1}省略g替换搜索模式的所有出现) }}调用:

sed

结果:

sort -f my_file | uniq -c | sed 's/ *//' | sed $'s/  */\t/' | less