URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5301
[ Назад ]

Исходное сообщение
"awk запись в файл"

Отправлено KiN , 30-Мрт-06 23:19 
Помогите пожалуйста с одним вопросом.
Есть ли возможность/программа, позволяющая изменить значение определенного столбца в определенной строке текстового файла ?
Т.е. с помощью awk можно прочитать это значение, а вот чем его можно изменить/записать в файл ?
Спасибо.

Содержание

Сообщения в этом обсуждении
"awk запись в файл"
Отправлено allez , 31-Мрт-06 06:52 
>Помогите пожалуйста с одним вопросом.
>Есть ли возможность/программа, позволяющая изменить значение определенного столбца в определенной строке текстового
>файла ?
>Т.е. с помощью awk можно прочитать это значение, а вот чем его
>можно изменить/записать в файл ?
>Спасибо.


Да с помощью того же awk:

Фрагмент исходного файла:
> cat /etc/fstab | grep swap
/dev/hda3 swap swap pri=44 0 0
/.swapfile swap swap pri=42 0 0

А теперь заменим во втором поле слово "swap" на "svop":
> cat /etc/fstab | grep swap | awk '{$2="svop"; print $0}'
/dev/hda3 svop swap pri=44 0 0
/.swapfile svop swap pri=42 0 0

Можно менять значение с проверкой условия:
> cat /etc/fstab | grep swap | awk '{if ($1 == "/.swapfile") $2="svop"; print $0}'
/dev/hda3 swap swap pri=44 0 0
/.swapfile svop swap pri=42 0 0

Ну, а чтобы внести изменения в исходный файл, необходимо перенаправить вывод awk во
временный файл, а затем заменить этим временным файлом исходный:
> cat fstab | grep swap | awk '{$2="svop"; print $0}' > tmpfile; mv tmpfile fstab


"awk запись в файл"
Отправлено KiN , 31-Мрт-06 12:59 
>Ну, а чтобы внести изменения в исходный файл, необходимо перенаправить вывод awk
>во
>временный файл, а затем заменить этим временным файлом исходный:
>> cat fstab | grep swap | awk '{$2="svop"; print $0}' > tmpfile; mv tmpfile fstab

Вот в чем была моя ошибка - я тумал что эта команда запишет во временный файл ТОЛЬКО одну строку, а не весь файл.
Теперь вижу что я ошибался.
Спасибо еще раз!



"awk запись в файл"
Отправлено BigShadow , 31-Мрт-06 15:53 
>> cat fstab | grep swap | awk '{$2="svop"; print $0}' > tmpfile; mv tmpfile fstab

кат и греп избыточен, можно ведь так:

awk '/swap/ {$2="svop"; print $0}' fstab > tmpfile; mv tmpfile fstab

плюс мона направлять вывод в файл из самого авк:

awk '/swap/ {$2="svop"; print $0 > "file"}' fstab

либо другой программе:

awk '/swap/ {$2="svop"; print $0 | "command"}' fstab

одним из средств поиска-замены явл. ф-ции gsub и sub

>Вот в чем была моя ошибка - я тумал что эта команда
>запишет во временный файл ТОЛЬКО одну строку, а не весь файл.

авк найдет, заменит и запишет все то, о чем вы его попросите :)))

RTFM http://ln.com.ua/~openxs/projects/man/uman024.html


"awk запись в файл"
Отправлено allez , 01-Апр-06 17:32 
>кат и греп избыточен, можно ведь так:
>
>awk '/swap/ {$2="svop"; print $0}' fstab > tmpfile; mv tmpfile fstab

Разумеется, можно :-).

Но, во-первых, я специально использовал grep для того, чтобы не перегружать awk лишними (в
данном конкретном случае) опциями. Учебный пример должен как можно полнее отражать
разбираемую задачу и снимать существующие вопросы, а не создавать новые ;-).

Во-вторых, мне лениво было создавать учебный файл, поэтому я решил использовать в примере
часть своего /etc/fstab, и grep мне представился вполне достойным выбором для отделения
этой части от целого.

Ну, а в-третьих, и, пожалуй, в-главных, я хотел бы, чтобы автор темы самостоятельно
подразобрался с остальными опциями awk, в качестве домашнего задания, так сказать :-).
А то он и без того ленив не в меру: вместо быстрого поиска в справочных материалах
предпочел забросить вопрос на форум и ждать ответа...

P.S. KiN, прошу вас не обижаться на мои слова, у меня и в мыслях нет нанести вам
оскорбление.


"awk запись в файл"
Отправлено KiN , 03-Апр-06 10:26 
>>кат и греп избыточен, можно ведь так:
>>
>>awk '/swap/ {$2="svop"; print $0}' fstab > tmpfile;
>
>Разумеется, можно :-).

Понимаете в чем проблема...
Я прежде чем писать в форум на самом деле искал решение и в книгах, и в инете.
НО, встречая строку подобного вида я думал так:
"awk обрабатывает файл построчно, следовательно, раз стоит знак ">" то в конечный файл будет записана только последняя строка."
Поэтому даже и не пробывал подобные решения.
А зря. :)


>P.S. KiN, прошу вас не обижаться на мои слова, у меня и
>в мыслях нет нанести вам
>оскорбление.

Да я же понимаю что Вы объясняли свое решение, а не критиковали мой вопрос.



"awk запись в файл"
Отправлено chip , 03-Апр-06 12:16 
>>> cat fstab | grep swap | awk '{$2="svop"; print $0}' > tmpfile; mv tmpfile fstab
>
>кат и греп избыточен, можно ведь так:
>
>awk '/swap/ {$2="svop"; print $0}' fstab > tmpfile; mv tmpfile fstab
>
>плюс мона направлять вывод в файл из самого авк:
>
>awk '/swap/ {$2="svop"; print $0 > "file"}' fstab
>
>либо другой программе:
>
>awk '/swap/ {$2="svop"; print $0 | "command"}' fstab
>
>одним из средств поиска-замены явл. ф-ции gsub и sub

В чём смысл всех этих изречений?! Учитывая то, что исходную задачу они _не выполняют_:
"...позволяющая ***изменить*** значение определенного столбца в определенной строке текстового файла"

chip@nebula:~$ awk '/swap/ {$2="svop"; print $0 }' /etc/fstab
/dev/hda3 svop swap sw 0 0
chip@nebula:~$

Адьёс!


"awk запись в файл"
Отправлено BigShadow , 03-Апр-06 13:02 
>>>> cat fstab | grep swap | awk '{$2="svop"; print $0}' > tmpfile; mv tmpfile fstab
>>кат и греп избыточен, можно ведь так:
>>awk '/swap/ {$2="svop"; print $0}' fstab > tmpfile; mv tmpfile fstab
>>плюс мона направлять вывод в файл из самого авк:
>>awk '/swap/ {$2="svop"; print $0 > "file"}' fstab
>>либо другой программе:
>>awk '/swap/ {$2="svop"; print $0 | "command"}' fstab
>>одним из средств поиска-замены явл. ф-ции gsub и sub
>
>В чём смысл всех этих изречений?! Учитывая то, что исходную задачу они
>_не выполняют_: "...позволяющая ***изменить*** значение определенного столбца
>в определенной строке текстового файла"

Эээ... вы точно нуждаетесь в ответе? ;)
Ну что ж. Ключевое слово во "всех этих изречениях" - ПЛЮС.
В ответ allezом был дан замечательный пример. ПЛЮС я привел дополнительную информацию.
Заметьте на тему "...с помощью awk можно прочитать это значение, а вот чем его можно изменить/записать в файл?", а не о полетах в космос. Вот и весь смысл. Что еще неясно?


Хотя если вернутца к оригинальным вопросам, то ответы должны быть совсем другими:

- Есть ли возможность/программа, позволяющая изменить значение определенного столбца в определенной строке текстового файла?
- Да такая возможность и программа существуют.

- Т.е. с помощью awk можно прочитать это значение, а вот чем его можно изменить/записать в файл?
- Это значение можно изменить и записать в файл при помощи того же awk.

P.S.
а вообще эту задачу реально выполнить средствами самого шелла без помощи авк :-Р


"awk запись в файл"
Отправлено chip , 03-Апр-06 16:17 
>>>>> cat fstab | grep swap | awk '{$2="svop"; print $0}' > tmpfile; mv tmpfile fstab
>>>кат и греп избыточен, можно ведь так:
>>>awk '/swap/ {$2="svop"; print $0}' fstab > tmpfile; mv tmpfile fstab
>>>плюс мона направлять вывод в файл из самого авк:
>>>awk '/swap/ {$2="svop"; print $0 > "file"}' fstab
>>>либо другой программе:
>>>awk '/swap/ {$2="svop"; print $0 | "command"}' fstab
>>>одним из средств поиска-замены явл. ф-ции gsub и sub
>>
>>В чём смысл всех этих изречений?! Учитывая то, что исходную задачу они
>>_не выполняют_: "...позволяющая ***изменить*** значение определенного столбца
>>в определенной строке текстового файла"
>
>Эээ... вы точно нуждаетесь в ответе? ;)

Мне ответ по большей части и не нужен. Это повод задуматься. К тому же на вопрос Вы всё равно не ответили.

.Адьёс.