2015-01-22 2 views
1

Это входной файл input.awk типа DOSAWK неправильно математике на первой линии только

06-13-2014,08:43:11 
RLS007817     
RRC001021     
yes,71.61673,0,150,37,1 
no,11,156,1.35,306.418 
4,3,-1,2.5165,20,-1.4204 
-4,0,11,0,0,0 
1.00E-001,0.2,3.00E-001,0.6786031,0.5,6.37E-002 
110,40,30,222,200,-539 
120,50,35,215,220,-547 
130,60,40,207,240,-553 
140,70,45,196,260,-560 
150,80,50,184,280,-566 
160,90,55,170,300,-573 
170,100,60,157,320,-578 
180,110,65,141,340,-582 
190,120,70,126,360,-586 
200,130,75,110,380,-590 

Это то, что я в основном нужно:

  • Пропустить первые 8 строк (OK)
  • Комплектование и разделить число на линиях 6,7 & 8 (OK)
  • Do AWK математику на колонках (Ошибка только в первой строке?)

BASH код

#!/bin/bash 
myfile="input.awk" 

vzeros=$(sed '6q;d' $myfile) 
vshift=$(sed '7q;d' $myfile) 
vcalib=$(sed '8q;d' $myfile) 
IFS=',' 
read -a avz <<< "${vzeros}" 
read -a avs <<< "${vshift}" 
read -a avc <<< "${vcalib}" 
z1=${avz[0]};s1=${avs[0]};c1=${avc[0]} 
z2=${avz[1]};s2=${avs[1]};c2=${avc[1]} 
z3=${avz[2]};s3=${avs[2]};c3=${avc[2]} 
z4=${avz[4]};s4=${avs[4]};c4=${avc[4]} 
#The single variables will be passed to awk 
awk -v z1="$z1" -v c1="$c1" -v s1="$s1" -v z2="$z2" -v c2="$c2" -v s2="$s2" -v z3="$z3" -v c3="$c3" -v s3="$s3" -v z4="$z4" -v c4="$c4" -v s4="$s4" 'NR>8 { FS = "," ; 
nc1 = c1 * ($1 - z1 - s1); 
nc2 = c2 * ($2 - z2 - s2); 
nc3 = c3 * ($3 - z3 - s3); 
nc4 = c4 * ($5 - z4 - s4); 
print nc1,nc2,nc3,nc4 }' $myfile > test.plot 

Это результат на файловом test.plot

11 -0.6 -3 -10 
12 9.4 7.5 100 
13 11.4 9 110 
14 13.4 10.5 120 
15 15.4 12 130 
16 17.4 13.5 140 
17 19.4 15 150 
18 21.4 16.5 160 
19 23.4 18 170 
20 25.4 19.5 180 

Это странная часть ... только в первой строке и после того, как в первом столбце все неправильно. .. И я понятия не имею, почему. Это ожидаемый результат файл:

11 7.4 6 90 
12 9.4 7.5 100 
13 11.4 9 110 
14 13.4 10.5 120 
15 15.4 12 130 
16 17.4 13.5 140 
17 19.4 15 150 
18 21.4 16.5 160 
19 23.4 18 170 
20 25.4 19.5 180 

Я напечатал поправочные коэффициенты, захваченные из линий 6,7 & 8 и все в порядке. Вся математика в порядке, кроме первой строки, после первой колонки.

ОС: Slackware 13.37.

AWK: GNU Awk 3.1.6 Авторское право (C) 1989, 1991-2007 Фонд свободного программного обеспечения.

+2

Это сделает ваш вопрос более ясным (и поможет вам отлаживать), если вы сосредоточились только на той части, которая не работает, и удалила остальные. –

+0

вы говорите, игнорируете первые 8 строк, но тогда вы получаете значения из строк 6,7,8? Вы имеете в виду строки 8+ (6,7,8)? Кроме того, ваша ошибка состоит в том, что у вас есть отрицательное число, а ваши выражения - '$ 2 - z2 - s2', указывает, что одно или несколько из этих значений пустые. (Да, это странно, и сложная часть отладки в awk. Добавить «print» z2 = «z2» s2 ... 'Удачи. – shellter

+0

Линии 6,7,8 содержат 6 столбцов с нулем, сдвигом и усилением Эти значения могут быть положительными или отрицательными. Массив Sed и Bash достаточно, чтобы забрать те, которые становятся z1 ... z4, c1..c4 и s1..s4. Даже с положительной, отрицательной и технической нотацией AWK делает это ПРАВО на всех линии, но сначала ... И первый столбец всегда в порядке! – Andreluiz

ответ

1

Ваш образец является слишком сложным, чтобы воспроизвести что-то, но я думаю, вы должны попробовать:

awk -F"," 'NR>8{... 

вместо

awk 'NR>8 { FS = "," ; 

Вы также можете попробовать с НАЧАТЬ:

awk 'BEGIN{FS=","}NR>8{... 

Я в конце концов протестировал ваш скрипт, и вы должны изменить положение параметра FS, как я уже сказал:

awk -v z1="$z1" -v c1="$c1" -v s1="$s1" -v z2="$z2" \ 
-v c2="$c2" -v s2="$s2" -v z3="$z3" -v c3="$c3" \ 
-v s3="$s3" -v z4="$z4" -v c4="$c4" -v s4="$s4" -F"," 'NR>8 { 
nc1 = c1 * ($1 - z1 - s1); 
nc2 = c2 * ($2 - z2 - s2); 
nc3 = c3 * ($3 - z3 - s3); 
nc4 = c4 * ($5 - z4 - s4); 
print nc1,nc2,nc3,nc4 }' $myfile 

11 7.4 6 90 
12 9.4 7.5 100 
13 11.4 9 110 
14 13.4 10.5 120 
15 15.4 12 130 
16 17.4 13.5 140 
17 19.4 15 150 
18 21.4 16.5 160 
19 23.4 18 170 
20 25.4 19.5 180 
0 -0.6 -3 -10 

У вас возникли проблемы?

Поскольку awk анализирует строку перед выполнением блока, поэтому, если вы скажете ей изменить что-то, что связано с синтаксическим разбором, изменения произойдут из следующей строки.

HTH

+0

Даже при этом изменении проблема остается. Результат такой же, как и в сообщении. – Andreluiz

+0

@Andreluiz См. отредактированный пост. Если он все еще ** действительно ** не работает, попробуйте метод BEGIN или, как говорится в укрытии, попробуйте новую версию awk – jrjc

1

Согласен с @jeanrjc.

Я скопировал ваш файл и скрипт на свой компьютер и уменьшил его до обработки первых двух строк ваших данных.

С вашим кодом как есть, я дублирую ваши результаты, т. Е.

#dbg $0=110,40,30,222,200,-539 
#dbg c2=0.2 $2= z2=3 s2=0 
11 -0.6 -3 -10 

#dbg $0=120,50,35,215,220,-547 
#dbg c2=0.2 $2= z2=3 s2=0 
12 -0.6 -3 -10 

С FS=","; закомментированного и -F, добавлены в список опций вывод, что вы ищете.

#dbg $0=110,40,30,222,200,-539 
#dbg c2=0.2 $2=40 z2=3 s2=0 
11 7.4 6 90 

#dbg $0=120,50,35,215,220,-547 
#dbg c2=0.2 $2=50 z2=3 s2=0 
12 9.4 7.5 100 

Поэтому убедитесь, что вы удалили FS=","; из блока кода, и вы используете -F, В любом случае, я бы сказал, что переустановка FS="," для каждой строки, которая обрабатывается не является полезным.

Если это еще не решит проблему, попробуйте скорректированный код на машине с более новой версией awk.


Понадобится небольшая журнальная статья полностью иллюстрирует то, что происходит во время чтения через первые 8 записей (при FS="[[:space:]]), переходе к первой строке, которая соответствует вашему правилу NR>8, пФ еще [:space:] когда поля анализируются, то FS устанавливается в ,, но эта первая строка не повторно сканируется.

IHTH!

+0

РАБОТАЕТ с -F, удалите g кавычки. Отлично! – Andreluiz

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