在 Linux 中使用特定分隔符对文本文件中的行进行排序

在 Linux 中使用特定分隔符对文本文件中的行进行排序

我需要对文本文件(没有任何扩展名)的行进行排序,其中行之间以 分隔。使用命令%时,这些s 也会被整理出来,这是我不想要的。sort%

如何从命令行或任何其他方法对文本文件进行排序并以相同的名称保存?

例如:

文件名:myfile

排序前>>

A line one
%
C line two
%
B line three
%

排序后>>

%
%
%
A line one
B line three
C line two

期望>>

A line one
%
B line three
%
C line two
%

答案1

我会去掉分隔符(awk寻找奇数行),将其排序到一个临时文件中(参见注释),然后使用 sed 该文件将分隔符添加回来。

awk 'NR%2==1' myfile | sort -o tmpfile; sed -r 's/$/\n\%/g' tmpfile

这只是输出,因此如果您希望将其传输回您的文件,请在其末尾stdout粘贴。我将其保留为空白,以便您可以测试它。> myfile

补充:处理重新插入分隔符的方法大约有一百种。这些方法都可以:

awk '{print $0"\n%"}'
while read line; do echo -e "$line\n%"; done
xargs -i^ echo -e "^\n%"  # won't work with a redirection >

答案2

也许这不是最好的性能解决方案,但是这种双重awk调用可以实现这一点:

$ awk 'BEGIN{RS="\n%\n"}1' file | sort | awk 'BEGIN{ORS="\n%\n"}1'
A line one
%
B line three
%
C line two
%

RS是“输入记录分隔符”和ORS“输出记录分隔符”。

之后的输出sort是这样的,所以很明显我们只是在使用 no-% 行:

$ awk 'BEGIN{RS="\n%\n"}1' file | sort 
A line one
B line three
C line two

相关内容