Начало редактирования
Более простое решение, чем приведенное ниже, которое также легко модифицируется, чтобы взять N-ю строку вперед, всегда в седе:
<command that output something> | sed -n -e '1h;2,3H;4,${H;g;s/\n.*\n/,/;p;g;s/^[^\n]*\n//;h}'
И объясненная версия, которую можно запустить с sed -n -f script
:
# Do not put a \n in front of the hold space for the 1st line.
1h
# For all lines except the 1st, append to the hold space.
2,$H
# From the 1st line than need to be append to another line, 4 in this case, ...
4,${
# Copy the hold space in the patter space, replace all what is between \n by ',', and print.
g
s/\n.*\n/,/
p
# Remove the 1st line from the hold space.
g
s/^[^\n]*\n//
h}
Конец редактирования
Кроме того, решение sed без файла:
<command that output something> | sed -n -e 'H;g;s/^\n\(.*\)\n\(.*\n.*\n\)\(.*\)$/\1,\3\n\2\3/;t next;b;:next;P;s/^[^\n]*//;h'
Как и все зашифрованное решение sed, оно заслуживает объяснения, которое я даю в виде закомментированного файла сценария sed, который можно запустить с sed -n -f script
:
# Append current line to the hold space and copy the hold space in the pattern space.
H
g
# Now, the hold and pattern space contain '\n<line1>\n<line2>...'.
# If we can match 4 lines in the pattern space, append 1st and 4th line at the beginning of the pattern space and remove the 1st line.
# If no substitution occurs, start next cycle, else print the concatenation, remove the concatenation from the pattern space, and copy the pattern space in the hold space for next cycle.
s/^\n\(.*\)\n\(.*\n.*\n\)\(.*\)$/\1,\3\n\2\3/
t next
b
:next
P
s/^[^\n]*//
h