Команда AWK виконується з помилкою out, але не змінюючи файл


1

Я застосовую команду awk до файлу, але цей файл не змінюється. хтось може підказати, чому це відбувається?

awk 'BEGIN{FS=OFS=""}; {if($692=="6") sub($690,"9");print $0;}' abc.txt >efg.txt

Примітка: кожен рядок містить близько 1000 символів.


команда працює, коли немає. символів менше 100
Су Бхо,

Яку команду ви точно використовуєте? Також параметр тощо, будь ласка
ADDB

Скопіюйте команду з терміналу, натисніть кнопку «Змінити» у своїх питаннях та вставте команду під питання.
Сергій Колодяжний

1
@RomeoNinov на Ubuntu awk- gawkце симпосилання , принаймні, у нових версіях ОС. Якщо це старший реліз, як 14.04, він може все-таки відправлятись mawk, але незалежно від того, команда все одно повинна працювати все одно
Сергій Колодяжний,

1
@RomeoNinov Якщо ви маєте на увазі, що ОП використовує різні ОС, так, можливо, вони повинні запитати на різних сайтах, наприклад, Unix та Linux . Але якщо це справді Ubuntu, я насправді не бачу, що тут може бути не так. Команда працює на моїх тестах
Сергій Колодяжний

Відповіді:


0

Що не так

Основне питання полягає в тому, що ви використовуєте sub()неправильно. sub()передбачається замінити на основі відповідності шаблону (це важлива частина!). Правильний синтаксис:

sub(regular_expression,replacement,substring)

Те, що ви робите, це sub($692,"9")так, що ви говорите йому, щоб замінити перше виникнення того самого, що ви бачите в полі 692 поля, але це перше виникнення може бути шлях вперед у рядку.

Ось приклад:

$ echo "1253456" | awk 'BEGIN{FS=OFS=""};{if($4==3) sub($6,"@");print}'                                                                               
12@3456

Це буквально займає будь-що в 6-му полі (яке є числом 5) і видаляє перше виникнення цієї речі. Те саме, що робила ваша команда.

Що насправді слід зробити

Щоб замінити певне поле, вам не потрібно sub(), просто призначте це поле безпосередньо.

awk 'BEGIN{FS=OFS=""}; {if($692==6) $690="9";print}' abc.txt >efg.txt

Зверніть увагу , що я також видалений $0з , printтому що виклик printсам уже передбачає $0за замовчуванням

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.