Bash 排序-在排序列表中以相同字母开头的每个组前面加上任意字符串
给出以下列表(输入): 我想要以下输出:Bash 排序-在排序列表中以相同字母开头的每个组前面加上任意字符串,bash,shell,sorting,awk,Bash,Shell,Sorting,Awk,给出以下列表(输入): 我想要以下输出: == A == apple == B == banana blueberry == M == mango melon 这是否可以在shell脚本中实现,或者使用awk或其他一些文本处理实用程序 其他假设: 在这种情况下,假设我们将管道输入到awk,如下所示: cat输入| awk… (可选)文本流包含非标准字符(非ASCII),如日语、阿拉伯语,还包含数字和特殊符号。也许这些可以在它们自己的类别中组合在一起(需要额外的逻辑) 您可以尝试此awk
== A ==
apple
== B ==
banana
blueberry
== M ==
mango
melon
这是否可以在shell脚本中实现,或者使用awk
或其他一些文本处理实用程序
其他假设:
awk
,如下所示:
cat输入| awk…
您可以尝试此
awk
:
awk '{s = substr($0, 1, 1)}
s != p {print "===", toupper(s), "==="} {p = s} 1' file
awk
详细信息:
:将每个记录的第一个字符保存在变量{s=substr($0,1,1)}
s
:如果s!=p
(s!=p
是变量,用于保存上一条记录的第一个字符)p
:用大写字母打印记录分隔符{print“==”,toupper(s),“==”}
s
:将{p=s}
保存在s
p
:打印每条记录1
awk
,你能举个例子说明你的建议吗?其他工具也可以,不必是awk
。我已经检查了人工排序
,但它似乎不受支持。谢谢,可以在一行中编写它并假设我们正在从标准输出流传输到awk吗?我正试图让它工作,但有一些问题..请澄清没有按预期工作
。它使用的数据与您在附件输出中看到的数据相同。很抱歉,问题完全在我这边。在整个处理过程中,我一直在从grep强制使用颜色,所以我必须去掉ANSI转义(颜色)代码才能使其正常工作<代码>sed-r“s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?[mGK]//g”谢谢您的帮助,仍然需要进行一些处理,但现在它已经按预期工作了!接受您的答案。@PetrusK。当您使用awk时,您不需要grep,并且您当然不需要在将grep输出传递给awk之前向sed添加一个修改grep输出的调用!sed-r's/foo//g'| awk'{bar}'
=awk'{gsub(/foo/,,“”);bar}’
awk '{s = substr($0, 1, 1)}
s != p {print "===", toupper(s), "==="} {p = s} 1' file
=== A ===
apple
=== B ===
banana
blueberry
=== M ===
mango
melon