LINUX.ORG.RU

сценарий на awk


0

1

есть текст

1 1 2 3 2/3
2 1 2 3 3/4
3 1 2 3 5/6
4 1 2 3 7/8

независимо от чисел, все числа первого столбца заменить на S

Код Bash

awk -F"|" '$0 ~/S/ {sub(".*«S»",«$0»)} {print}'

не верен
как надо?

Ответ на: комментарий от return12

заменить 1 столбец не тронув другие

return12
() автор топика
Ответ на: комментарий от return12

Ась?

$ echo -e '1 1 2 3 2/3\n2 1 2 3 3/4\n3 1 2 3 5/6\n4 1 2 3 7/8'                            
1 1 2 3 2/3
2 1 2 3 3/4
3 1 2 3 5/6
4 1 2 3 7/8
$ echo -e '1 1 2 3 2/3\n2 1 2 3 3/4\n3 1 2 3 5/6\n4 1 2 3 7/8' | awk '{ $1 = "S"; print }'
S 1 2 3 2/3
S 1 2 3 3/4
S 1 2 3 5/6
S 1 2 3 7/8
Lavos ★★★★★
()
Ответ на: комментарий от Lavos

я подзабыл шелл надо вообшще преобразовать в в следующее:

1 1 2 3 2/3
2 1 2 3 3/4
3 1 2 3 5/6
4 1 2 3 7/8

в

S 1000 2 3000 2/3
S 1000 2 3000 3/4
S 1000 2 3000 5/6
S 1000 2 3000 7/8
2 и 4 столбцам независимо от числа добавать разряды 3 нуля

return12
() автор топика
Ответ на: комментарий от return12

это тестовый образец
но количество строк не определено
может50 а может и 160
надо сделать не зависимо от числа строк
строк не более 350

return12
() автор топика
Ответ на: комментарий от Lavos

изначально выражение

1=1,2,3,23,5;6
2=1,2,3,34,5;6
3=1,2,3,56,5;6
4=1,2,3,78,5;6

идёт 2ной повтор, и в 1ом awk видимо не хватает echo

return12
() автор топика
Ответ на: комментарий от return12
# sed '{s/,\|;\|=/ /g; s/23/2\/3/g; s/34/3\/4/g; s/56/5\/6/g; s/78/7\/8/g}' /home/malamut/Transponders/10000 >> 9999
linux-bst0:/home/malamut/Transponders # awk '{$6 = $7 = ""; gsub("[[:space:]][[:space:]]+", " "); print}' /home/malamut/Transponders/9999
 
 
 
1 1 2 3 2/3 
2 1 2 3 3/4 
3 1 2 3 5/6 
4 1 2 3 7/8 
 
 # awk '{$1="S";for(i=length($2);i<4;i++)$2=$2"0";for(i=length($4);i<4;i++)$4=$4"0";print}' /home/malamut/Transponders/9999
S 0000  0000
S 0000  0000
S 0000  0000
S 1000 2 3000 2/3 5 6
S 1000 2 3000 3/4 5 6
S 1000 2 3000 5/6 5 6
S 1000 2 3000 7/8 5 6
S 0000  0000
return12
() автор топика
Ответ на: комментарий от return12

надо

S 1000 2 3000 2/3
S 1000 2 3000 3/4
S 1000 2 3000 5/6
S 1000 2 3000 7/8

return12
() автор топика
Ответ на: комментарий от Lavos
/Transponders # sed '{s/,\|;\|=/ /g; s/23/2\/3/g; s/34/3\/4/g; s/56/5\/6/g; s/78/7\/8/g}' /home/malamut/Transponders/10000 >> 9999
/Transponders # awk '{$1="S";for(i=length($2);i<4;i++)$2=$2"0";for(i=length($4);i<4;i++)$4=$4"0"}NF>=5{print $1,$2,$3,$4,$5}' /home/malamut/Transponders/9999
S 1000 2 3000 2/3
S 1000 2 3000 3/4
S 1000 2 3000 5/6
S 1000 2 3000 7/8
return12
() автор топика
Ответ на: комментарий от return12

разряды не добавил ну и дроби совпадений надо буфер вырубать

S 11727 V 27500 3/4
S 11747 H 27500 3/4
S 11766 V 27500 3/4
S 117/85 H 27500 2/3
S 1182/3 H 27500 3/4
S 11843 V 27500 3/4
S 11861 H 27500 2/3
S 11881 V 27500 2/3
S 11900 H 27500 2/3
S 11919 V 27500 3/4
S 11938 H 27500 3/4
S 11958 V 27500 2/3
return12
() автор топика
Ответ на: комментарий от return12

2 и 4 столбцам, независимо от числа, добавить разряды 3 нуля-выше писал

return12
() автор топика
Ответ на: комментарий от return12

ни второй исправил-awk '{$1=«S»;for(i=length($2);i<8;i++)$2=$2"0";for(i=length($4);i<8;i++)$4=$4"0"}NF>=5{print $1,$2,$3,$4,$5}'

return12
() автор топика
Ответ на: комментарий от return12

разряды не добавил

Т.е. совсем к любому числу добавить три нуля?
Я думал '1' -> '1000', '12' -> '1200', т.е. выровнять число до 4х цифр.
Тогда можно просто умножить число на 1000:

awk '{$1="S"}NF>=5{print $1,$2*1000,$3,$4*1000,$5}'

Lavos ★★★★★
()
Ответ на: комментарий от Lavos

правильное и изящное решение. всё ок

return12
() автор топика
Ответ на: комментарий от ananas

Ага, забыл поправить. Наследие первой версии, где было просто «print».

Lavos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.