2016-03-29 2 views
2

У меня есть этот файлAWK конкатенация не работает

*PADS2000* 
*PART* 
C1    C2012 
C10    C2012 

*NET* 
*SIGNAL* B2B_12V 
F1.2 TC1.1 
CNB2.88 U2.1 
*SIGNAL* DDR3_VREF1 
U9.M8 U9.H1 
U5.6 C24.1 
*END* 

, и я хочу, чтобы преобразовать его выглядеть следующим образом (имя сигнала списка и все подключенные имена part.pin в одной строке).

*SIGNAL* B2B_12V F1.2 TC1.1 CNB2.88 U2.1 
*SIGNAL* DDR3_VREF1 U9.M8 U9.H1 U5.6 C24.1 

Этот сценарий, который я написал, выглядит следующим образом.

BEGIN{print "========================="} 
(d || f) && (/*SIGNAL*/ || /*END/) {print "HAHAHA : " xline} 
/*SIGNAL*/{kept=$0; f = 1; xline=$0; next} 
f {print kept; f = 0; d = 1; print; xline=xline " " $0; next} 
d {print; xline=xline " " $0} 

Выход такой.

========================= 
*SIGNAL* B2B_12V 
F1.2 TC1.1 
CNB2.88 U2.1 
CNB2.88 U2.1 AL* B2B_12V 
*SIGNAL* DDR3_VREF1 
U9.M8 U9.H1 
U5.6 C24.1 
U5.6 C24.1 NAL* DDR3_VREF1 
*END* 

Что не так? (Похоже, что строки перезаписываются каждый раз, когда они должны быть объединены.)

EDIT: Позже я обнаружил, что это работает так, как я хотел в Cygwin. у моей оболочки CentOS, похоже, есть что-то странное. Если я запустил его на Cygwin, он работает как внизу, как я ожидал. (Приду к моей проблеме оболочки, когда у меня есть время.)

$ awk -f why.awk in.dat 
========================= 
*SIGNAL* B2B_12V 
U24.2 TC1.1 
CNB2.88 U2.1 
HAHAHA : *SIGNAL* B2B_12V U24.2 TC1.1 CNB2.88 U2.1 
*SIGNAL* DDR3_VREF1 
U9.M8 U24.H1 
U5.6 C24.1 
HAHAHA : *SIGNAL* DDR3_VREF1 U9.M8 U24.H1 U5.6 C24.1 
*END* 
+3

Вам нужно только один оператор 'print' в вашем коде, который всегда выводит завершающий символ' \ n'. Остальное должно быть 'printf (...)', которые НЕ включают завершающий символ '\ n'. Удачи. – shellter

+0

Регулярное выражение '/ * SIGNAL * /' является незаконным, так как * является метасимволом RE. Вам следует избегать *. '(/ \ * SIGNAL \ */||/\ * END /)' – cdarke

+0

@cdarke, но/* SIGNAL * /, похоже, работает в awk. –

ответ

1

Я DIT его с помощью Gawk на Cygwin, но он также работает на моем CentOS 6.7 оболочки. Но есть некоторые проблемы с моей оболочкой CentOS, как я добавил в EDIT выше. Для чьей пользы я прилагаю мой поглазеть сценарий здесь:

BEGIN{print "========================="} 

(f || d) && (/*SIGNAL*/ || /*END*/) { 
f=0; d = 0; n = asort(xline); 
printf "%s ", kept; 
for (i=1;i<=ix; i++){ 
printf "%s ", xline[i]; 
} 
printf "\n"; 
ix = 0; 
} 

/*SIGNAL*/{ 
kept = $0; f = 1; next} 

f { 
f = 0; d = 1; 
for(i=1;i<=NF;i++) { 
    xline[ix] = $i; 
    ix = ix + 1; 
} 
next} 

d { 
for(i=1;i<=NF;i++) { 
    xline[ix] = $i; 
    ix = ix + 1; 
} 
next} 

Выход:

*SIGNAL* B2B_12V CNB2.88 TC1.1 U2.1 U24.2 
*SIGNAL* DDR3_VREF1 C24.1 U24.2 U24.H1 U5.6 

EDIT:
позже я обнаружил, что это странное явление, так как входной текстовый файл был из DOS (Windos). См. Ответ Адама Каца в awk string concatenation not working 2 (shell setting error?).

+0

Смотрите мой комментарий к RE, которые вы используете. Это вызывает ошибки в OS X. Это не оболочка, кстати, 'awk' не имеет ничего общего с оболочкой, это ее собственный язык. – cdarke

+1

pluse-uno для борьбы с вашим собственным рабочим ответом. Пожелайте своим комментаторам хорошо! Всем удачи. – shellter

+0

см. Мой EDIT выше. Благодаря! –

Смежные вопросы