用 sed 连接 n 行

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)

mik*_*erv 5

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)

...这将是一种相当通用的方法,尽管它依赖于输入文件中没有空格。它连接一个空格上的每两行,将最后一个;分割的字段复制到每行的开头,对第一个字段进行排序,然后将其切掉并将行拆分回来。

  • 如果您想要连接更多行而不是数百个 `-`,您可以使用 `xargs -n5 &lt;file` 代替 paste,其中 5 是要连接的行数。 (2认同)
  • @User112638726 - 那是完全不同的事情。这是每五个输入行的 `/bin/echo` 执行。如果你不想输入数百个 `-` 破折号,例如:`set "" - -; 而 [ "$#" -lt 100 ]; 设置 "$@$@"; 完毕; shift "$(($#-100))"; 粘贴 "$@"` 或 `eval 粘贴 "$(printf %100s|sed 's/./- /g')"` (2认同)
  • 足够公平:) IMO 更明显的是 xargs 正在做什么并且更整洁,所以如果资源丰富,那么我个人认为它是更好的选择。此外,我发布的原始内容是错误的,并在所有 [[:space:]] 字符上拆分。命令应该是`xargs -d'\n' -n5 &lt; file` (2认同)