最近,我问了一个问题如何对行对进行排序,答案之一建议将行与 串联起来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]'
效果非常好,但现在我的问题概括为对 n 元组行进行排序,我不知道如何使用 sed 来做到这一点。
我发现的所有内容要么是 2 行,要么是所有行,但我需要 n 行(其中 n 目前是 5,但通用的方法就很好)。
重写该部分以容纳 n 行的好方法值得加分perl
,但问题实际上与该sed
部分有关。
我也没有sed
特别关注,所以如果您有使用不同命令行工具的好解决方案,请发布它。
更新:示例输入 (n == 3)
a1;b1;c1;
n1;m1;l1;
d1;e1;f1;g1
n2;m2;l2;
a2;b2;c2;
d2;e2;f2;g2
答案1
sed -e:n -e$\bo -e'N;s/\n/&/4;to' -ebn -e:o -e'y/\n/ /' <in >out
这将连接 5 行 - 或 1 + 4 行 - 用一个空格替换每个换行符。然而:
paste -d\ - - - - - <in >out
...也可以。
你的g
事情可以这样工作:
paste -d\ - - <input |
sed 's/.*;\(.*\)/\1;&/' |
sort -t\; -k1,1 |
cut -d\; -f2- |
tr \ \\n
...这将是一种相当通用的方法,尽管它依赖于输入文件中没有空格。它将每两行连接在一个空格上,将最后一个;
分割字段复制到每行的头部,对第一个字段进行排序,然后将其切掉并将行重新分割出来。
答案2
只需稍作修改,即可使用该解决方案我已经发布关于你的另一个问题。
再次使用 GNU sed 和 GNU awk 并假设数据的同质结构,使用最后一个元素作为排序键:
# Separate input into records, here 3 lines each
sed '3~3G' infile |
# Use GNU awk's built-in sort, here index-string-descending
awk '
BEGIN { PROCINFO["sorted_in"] = "@ind_str_desc" }
{ h[$NF] = $0 }
END { for(k in h) print h[k] }
' RS= FS='[;\n]+'
输出:
n2;m2;l2;
a2;b2;c2;
d2;e2;f2;g2
a1;b1;c1;
n1;m1;l1;
d1;e1;f1;g1