【问题标题】:Sort text file alphabetically in groups (Linux)按字母顺序分组文本文件(Linux)
【发布时间】:2018-01-28 05:00:33
【问题描述】:

我知道如何按字母顺序对文本文件进行排序,但我想做的不仅仅是排序(即分组)。

我正在尝试创建一个 Unix Shell 脚本,该脚本将我的组织中的 /etc/hosts 文件格式化为以下格式:

From: 
Xsb ip 
aabc ip 
A2bc ip 
Eexg ip 
exx ip 
Fxg ip


To:

### A 
aabc ip 
a2bc ip 
### E 
eexg ip 
exx ip
### F 
fxg ip
### X
xsb ip

然后我将创建另一个脚本来添加新的主机名行,但现在我不确定最紧凑的方法是什么。我想也许我需要使用 for 循环来循环主机名的所有首字母,但您的专家建议以最短的方式受到高度赞赏。

【问题讨论】:

  • 虽然 WangJie 的回答符合您的要求,但如果您发现您的 /etc/hosts 如此复杂,您可能会考虑使用 bind .. :}
  • 您的问题是/etc/hosts 的输入格式为<ip-address> <hostname.domain.org> <hostname>,其中最后的hostname(或简称)可以是任意数量的别名。您的/etc/host 是否包含多个 IP 的别名?如果是这样,您想要每个列表吗? /etc/hosts中的cmets将如何处理?你都尝试了些什么?哪里失败了?
  • 感谢大卫的评论。我还没有开始创建脚本,我还在头脑风暴中。我在一个非常庞大的环境中工作,其中数十个 /etc/hosts 中有数百个主机名,并且有多个编辑文件的用户,所以我想通过一个可以统一 /etc/hosts 编辑的 shell 脚本创建一个进程。 cmets 将位于每次脚本运行时附加的 /etc/hosts 的最顶部或最底部。我计划为此目的使用小容器(即 header.in、cmets.in、main.in),每个容器都被附加并重定向到最终的 /etc/hosts 输出中。

标签: linux shell file sorting grouping


【解决方案1】:

以下脚本可能会满足您的需求。

tr A-Z a-z | sort | awk '{\
  if (last != substr($0, 0, 1)) {\
    print "### "toupper(substr($0,0,1))"\n"$0; last = substr($1, 0, 1)\
  } else {\
    print $0\
  }\
}'
  • tr 字母转小写
  • sort 按字母顺序排列文本
  • awk 行首字母与下一行不同时添加 '###'

希望对你有帮助。

【讨论】:

  • 非常感谢王杰,请给我一些时间来验证,然后你会得到最好的答案。太棒了:)
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
相关资源
最近更新 更多