Это должно работать:
function pra(a) {
for(e in a) {
printf "%s ", a[e];
}
print "";
}
BEGIN {
vals[10] = 1;
vals[11] = 2;
vals[12] = 3;
vals[30] = 4;
vals[31] = 5;
vals[32] = 6;
}
NR == 1 { split($0, a, " ") }
NR == 2 { split($0, b, " ") }
NR > 2 {
if($2 == "90") {
a[2] = vals[a[2]];
}
pra(a);
al = 0;
for(i in a) al++;
for(i = 1; i <= al; i++) {
a[i] = b[i];
}
split($0, b, " ");
}
END {
pra(a);
pra(b);
}
Краткое описание того, как это работает: * Блок BEGING - присвойте значения перевода vals
* NR == 1 и NR == 2 - запомните первые двастроки в разделенные массивы a
и b
* NR> 2 - для всех строк после первых двух * Если второй столбец имеет значение 90
, измените его, используя массив перевода * Переместите элементы массива b
в a
и разделить текущую строку на b
* END block - выведите a
и b
, которые в основном являются двумя последними строками
Пример выполнения:
$ cat inp && awk -f mkt.awk inp
# Type Response Acc RT Offset
1 70 0 0 0.0000 57850
2 31 0 0 0.0000 59371
3 41 0 0 0.0000 60909
4 70 0 0 0.0000 61478
5 31 0 0 0.0000 62999
6 41 0 0 0.0000 64537
8 70 0 0 0.0000 65106
9 11 0 0 0.0000 66627
10 21 0 0 0.0000 68165
11 90 0 0 0.0000 68700
12 31 0 0 0.0000 70221
# Type Response Acc RT Offset
1 70 0 0 0.0000 57850
2 31 0 0 0.0000 59371
3 41 0 0 0.0000 60909
4 70 0 0 0.0000 61478
5 31 0 0 0.0000 62999
6 41 0 0 0.0000 64537
8 70 0 0 0.0000 65106
9 2 0 0 0.0000 66627
10 21 0 0 0.0000 68165
11 90 0 0 0.0000 68700
12 31 0 0 0.0000 70221
Вы можетесделайте что-то вроде этого:
function pra(a) {
printf "%4d%8d%3d%5d%9.4f%6d\n", a[1], a[2], a[3], a[4], a[5], a[6]
}
BEGIN {
vals[10] = 1;
vals[11] = 2;
vals[12] = 3;
vals[30] = 4;
vals[31] = 5;
vals[32] = 6;
}
NR == 1 { print }
NR == 2 { split($0, a, " ") }
NR == 3 { split($0, b, " ") }
NR > 4 {
if($2 == "90") {
a[2] = vals[a[2]];
}
pra(a);
for(i = 1; i <= 6; i++) {
a[i] = b[i];
}
split($0, b, " ");
}
END {
pra(a);
pra(b);
}
Чтобы заставить его работать для этого конкретного случая, который включает в себя форматирование.Пример прогона:
$ cat inp && awk -f mkt.awk inp
# Type Response Acc RT Offset
1 70 0 0 0.0000 57850
2 31 0 0 0.0000 59371
3 41 0 0 0.0000 60909
4 70 0 0 0.0000 61478
5 31 0 0 0.0000 62999
6 41 0 0 0.0000 64537
8 70 0 0 0.0000 65106
9 11 0 0 0.0000 66627
10 21 0 0 0.0000 68165
11 90 0 0 0.0000 68700
12 31 0 0 0.0000 70221
# Type Response Acc RT Offset
1 70 0 0 0.0000 57850
2 31 0 0 0.0000 59371
4 70 0 0 0.0000 61478
5 31 0 0 0.0000 62999
6 41 0 0 0.0000 64537
8 70 0 0 0.0000 65106
9 2 0 0 0.0000 66627
10 21 0 0 0.0000 68165
11 90 0 0 0.0000 68700
12 31 0 0 0.0000 70221