используя sed с переменными в CSH - PullRequest
0 голосов
/ 11 мая 2018

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

Пример:

входной файл -

SAK, 123, 345
SAK, 456, 789
SAK, 789, 901

Как я хочу, чтобы мой вывод выглядел -

1, 123, 345
2, 456, 789
3, 789, 901

Как видите, SAK заменяется числом, но число увеличивается каждый раз.

Я пытался сделать это:

#!/bin/csh -f
set filename=/export/home/develop/data/buy_load_file.dat

set line=1
set sak_num=1
set search=SAK

set totallines=`wc -l $filename | cut -f1 -d' '`

echo $totallines

while( $line <= $totallines )
`sed "$line s/$search/$sak_num/" $filename`
@ line++
@ sak_num++
end

Но команда sed никогда не работает для меня. Я пытался прочитать разные способы сделать это, но я думаю, что моя проблема с $ filename, что он не может прочитать это правильно. Я думаю, что awk может быть другой командой, которая может делать то, что я хочу, но не знаю, как это сделать.

Есть идеи? Или, может быть, мне проще получить желаемый результат. Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Если ваша входная выборка является репрезентативной в том смысле, что строка поиска встречается ровно один раз в каждой записи как первое поле:

$ awk '{print ++n ",", $2, $3}' file
1, 123, 345
2, 456, 789
3, 789, 901

( РЕДАКТИРОВАТЬ : заменить предыдущие версии еще однойобщее решение)

В более общем случае, если строка поиска может встречаться несколько раз или вообще не встречаться в данной записи:

$ cat file2
SAK, abc, def,
ghi, jkl, mno
pqr, SAK, SAK
stu, vwx, yz
aaa, bbb, SAK


$ awk -v search=SAK '{for (i=1; i<=NF; ++i) if (sub(search, n+1, $i)) ++n}1' file2
1, abc, def,
ghi, jkl, mno
pqr, 2, 3
stu, vwx, yz
aaa, bbb, 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...