用 sed 连接 n 行

用 sed 连接 n 行

最近,我问了一个问题如何对行对进行排序,答案之一建议将行与 串联起来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

相关内容