按行组对文件进行排序

按行组对文件进行排序

如果我有一个内容类似于以下内容的文件:

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

相关内容