Необходимо работать /opt/SolarisStudio12.3/bin/cc
и никогда /usr/ucb/cc
- ucb сценарий является старой оберткой совместимости для создания программного обеспечения SunOS 4, которое не работает с текущими выпусками Studio и было удалено из Соляриса 11 и позже.
Самый простой должен гарантировать это /opt/SolarisStudio12.3/bin
находится в Вашем $PATH
переменная среды перед /usr/ucb
.
Вот решение SED
решение , которое будет сводить в зависимости от одной последовательности ,, $
линий, следующих за последним, происходящим ^ 1
строки:
sed -e '/^1/{x;s/\n/ /gp;d' -e '};/,,$/H;$G;D
' <<\IN
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
2, q1, q2, q3, q4, q5, q6, q7
2, q9, q10,,
2, r1, r2, r3, r4, r5, r6, r7
2, r9, r10,,
1, s1, s2, s3, s4, s5, s6, s7
2, s9, s10,,
IN
E X
Изменения H
H H Старые и шаблонные пространства на линиях, которые начинаются с ^ 1
и /// P
rints Из H
старое пространство было предыдущему для этого только в случае успешной замены. Линии, заканчивающиеся с , $
добавлены к H
H Старое пространство после \ N
символ EWLine, а затем все линии D
к первому происходящему \ N
EWLINE. На $
в последней строке H
H Старое пространство добавляется к узору пространства после A \ N
\ N EWLINE - так, когда он D
Перезапускает линейный цикл в верхней части сценария, содержащего только то, что содержится H
старое пространство, которое напечатано напечатано по мере необходимости.
1, p1, p2, p3, p4, p5, p6, p7 2, p9, p10,, 2, q9, q10,, 2, r9, r10,,
1, s1, s2, s3, s4, s5, s6, s7 2, s9, s10,,
Если, с другой стороны, вы не хотите последующую / ,,, $ /
вхождений, то это может сделать:
sed -e '/^1/{x;y/\n/ /;s/,,.*/,,/p;d' -e '};/,,$/H;$G;D'
Учитывая одинаковый вход, который печатает вместо этого:
1, p1, p2, p3, p4, p5, p6, p7 2, p9, p10,,
1, s1, s2, s3, s4, s5, s6, s7 2, s9, s10,,
Но это получит / ,,, $ /
линии, напечатанные, даже если они не сразу последуют / ^ 1 /
совпадение. Если вы хотите, только если они будут немедленно последовательны в входе - вы можете сделать это, а также:
sed -n '/^1/!d;$p;N;/\n1/P;/,,$/s/\n/ /p;D'
, который работает таким образом:
D
Элементы из вывода всех линий !
не начинается с / ^ 1 /
n
, которые не заканчиваются / ,, $ /
. $
последнее пространство шаблона ввода входной линии p
RInted, потому что следующая команда завершится скриптом. / ^ 1 /
соответствует его добавлению N входной линии входа
в пространстве шаблона после \ N
символа EWLINE. / \ N1 /
. p
Rints предыдущий.
P
печатает только до первого происходящего \ N
EWLILE в области шаблона. N
P Ext входная линия, если шаблон $
заканчивается с помощью / ,,, $ /
сопоставить его ///
Ubstitute пространственный символ для вставленного \ N
символ EWLINE и P
Rints Результаты. D
, в том числе до первого происходящего \ N
символ EWLINE.
N
N Ext входная линия не совпадает / ,, $ /
Отправляется обратно в верхнюю часть сценария как голова строки. Отказ Если в этот момент он не совпадает ^ 1
это D
D полностью. / ,, $ /
уже имел их \ N
\ N EWLINE, полностью удаляемый на этот момент, они удаляются от расхода здесь. Все это означает, что если / ^ 1 /
линии следуют друг за другом, они все еще печатаются, и если линии, которые не заканчиваются в ,, $
Следуйте ^ 1
Они не напечатаны.
Что касается вашего первого запроса, вы можете использовать --e
, чтобы объединить выражение в SED:
~$ sed -n -e '/^1/p' -e '/,,$/p' f
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
2, p9, p10,,
2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
, и если вы не хотите дубликата:
~$ sed -n -e '/^1/p' -e '/,,$/p' f | uniq
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
с awk Комбинируйте Regex с ;
:
~$ awk '/^1/;/,,$/' f
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
2, p9, p10,,
2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7
2, p9, p10,,
Вы можете условно установить ORS
, чтобы получить вывод в нужном формате
awk '/^1/,/,,$/{ORS = /^1/? ", ": "\n"; print}' file
1, p1, p2, p3, p4, p5, p6, p7, 2, p9, p10,,
1, p1, p2, p3, p4, p5, p6, p7, 2, p9, p10,,