fif*_*tra 5 sed text-processing sort
最近,我问了一个如何对线对进行排序的问题,其中一个答案建议将线与 连接起来sed,如下所示:
cat file.txt | sed -n 'N;s/\n//;p' | sort -t";" -k43,43n | perl -F';' -ane '$,=";";print @F[0..13],"\n";print @F[14..$#F]'
Run Code Online (Sandbox Code Playgroud)
效果很好,但现在我的问题概括为对行的 n 元组进行排序,我不知道如何使用 sed。
我发现的所有内容都是 2 行或所有行,但我需要 n 行(此时 n 为 5,但一般方式会很棒)。
重写perl零件以容纳 n 行的好方法的加分项,但问题实际上出在sed零件上。
我也没有sed特别关注,所以如果你有一个使用不同命令行工具的不错的解决方案,请发布它。
更新:示例输入(n == 3)
a1;b1;c1;
n1;m1;l1;
d1;e1;f1;g1
n2;m2;l2;
a2;b2;c2;
d2;e2;f2;g2
Run Code Online (Sandbox Code Playgroud)
sed -e:n -e$\bo -e'N;s/\n/&/4;to' -ebn -e:o -e'y/\n/ /' <in >out
Run Code Online (Sandbox Code Playgroud)
这将连接 5 行 - 或 1 + 4 行 - 用一个空格替换每个换行符。然而:
paste -d\ - - - - - <in >out
Run Code Online (Sandbox Code Playgroud)
……也可以。
你的g排序可以这样工作:
paste -d\ - - <input |
sed 's/.*;\(.*\)/\1;&/' |
sort -t\; -k1,1 |
cut -d\; -f2- |
tr \ \\n
Run Code Online (Sandbox Code Playgroud)
...这将是一种相当通用的方法,尽管它依赖于输入文件中没有空格。它连接一个空格上的每两行,将最后一个;分割的字段复制到每行的开头,对第一个字段进行排序,然后将其切掉并将行拆分回来。