如果我有一个内容类似于以下内容的文件:
FirstSection
Unique first line in first section
Unique second line in first section
SecondSection
Unique first line in second section
Unique second line in second section
...
NthSection
Unique first line in Nth section
Unique second line in Nth section
是否可以使用unix命令(例如sort、awk)按每三行组中的第一个非缩进行按字母顺序对文件进行排序,同时将缩进行保留在现有组下?
答案1
使用 Perl,您可以运行以下内容:
- 吞咽文件 (
perl -0n
) - 通过不缩进的行分割输入
split(/^(?=\S)/m)
- 排序并打印
perl -0ne 'print sort split(/^(?=\S)/m) ' ex
答案2
首先 sed 将每个节放在一行上,使用文本<EOL>
作为节行之间的分隔符。然后我对这些部分进行排序并使用第二个 sed 将每个<EOL>
部分恢复为换行符。
sed -r ':r;$!{N;br};s:\n([[:blank:]])(\1*):<EOL>\1\2:g' file|sort|sed -r '/^$/d;:l;G;s:(.*)<EOL>(.*)(\n):\1\3\2:;tl;$s:\n$::'
我没有选择字符作为分隔符,因为输入文件可能有它,所以我使用了它<EOL>
。
输出:我在每个部分(最后一个部分除外)后面添加了一个换行符,以重新创建输入文件的样式。
FirstSection
Unique first line in first section
Unique second line in first section
NthSection
Unique first line in Nth section
Unique second line in Nth section
SecondSection
Unique first line in second section
Unique second line in second section
答案3
awk
使用GNU asort()
,PROCINFO["sorted_in"]
我们可以根据每组之间的换行符将每组记录保存到一个awk关联数组中;然后使用asort()
for 循环对数组进行排序并打印所有组。
awk '/^$/{ ++grpNr; next }
{ groups[grpNr]=(groups[grpNr]==""? "" : groups[grpNr] RS) $0 }
END{ asort(groups);
for(grp in groups) print groups[grp]
}' infile
笔记:您可以使用PROCINFO["sorted_in"]
element来设置您需要哪种类型的排序;例如PROCINFO["sorted_in"]="@val_str_desc"
将排序瓦尔我们的数组的 ue 为斯特ing 和 in描述命令。
或者使用any awk
(生成 Nul 分隔的记录块)+ sort -z
(根据 Nul 字符而不是换行符进行排序)+ tr
(通过 删除先前添加的 Nul 字符awk
):
<infile awk '/^$/{ ++grpNr; next }
{ groups[grpNr]=(groups[grpNr]==""? "\0" : groups[grpNr] RS) $0 }
END{ for(grp in groups) print groups[grp] }' |sort -z |tr -d '\0'
对输入文件进行测试,例如:
BFirstSection
Unique first line in first section
Unique second line in first section
DSecondSection
Unique first line in second section
Unique second line in second section
Aanothersection...
...
...
CfourthSection
Unique first line in Nth section
Unique second line in Nth section
您将得到如下输出:
Aanothersection...
...
...
BFirstSection
Unique first line in first section
Unique second line in first section
CfourthSection
Unique first line in Nth section
Unique second line in Nth section
DSecondSection
Unique first line in second section
Unique second line in second section