Замените определенный текст только в определенных полях с помощью nawk

Если вы используете какой-нибудь текстовый редактор, попробуйте использовать только один:

awk -F ".scheduleName." '
    NR==1{printf "%s ", FILENAME}
    NR<4{printf "%s ",$2}
    END{print""}' $(ls -t | head -1)

Я надеюсь, что есть более 1 ScheduleName в строке, чтобы удалить первые и последние символы со второго поля?

0
19.08.2014, 04:18
3 ответа

У меня нет nawk , но это работает для меня (с gawk , с использованием переключателя - posix ):

awk 'BEGIN{FS=OFS=","}{sub(/0568/,"0808",$3)}1' file

комментарий fedorqui предполагает, что вам может потребоваться использовать -v OFS = ', ', а не -vOFS =', ', но если разделители ввода и вывода совпадают, назначение в блоке BEGIN не намного длиннее. Я также изменил ваш gsub на sub , поскольку похоже, что вы хотите сделать только одну замену. Первым аргументом любой функции является регулярное выражение, поэтому вы не должны передавать ему строку.

Вывод:

"20131008","0004","0808","98"
1
28.01.2020, 02:52

Этот ответ демонстрирует примеры awk и sed, как в выводе командной строки, так и в изменении файлов.

Для awk мы используем $ awk -F"," '{gsub("0568", "0808", $3)}1' input.txt и получим измененную строку в выводе командной строки (или в переменную), но исходный файл не изменится.

$ cat input.txt 
"20131008","0004","0568","98"
$ awk -F"," '{gsub("0568", "0808", $3)}1' input.txt
"20131008" "0004" "0808" "98"

Для sed будем использовать простую форму sed -i 's/string to replace/new string/g' input.txt, где -i флаг для изменения (т.е. модификации исходного файла).

$ cat input.txt 
"20131008","0004","0568","98"
$ sed -i 's/0568/0808/g' input.txt
$ cat input.txt 
"20131008","0004","0808","98"

Хотя это не то, что вы просили в nawk (у меня он не установлен), надеюсь, вы найдете это полезным.

1
28.01.2020, 02:52

Я пробовал это:

nawk 'BEGIN { FS=OFS="," } { sub("0568","0808",$3) }1' abc.txt

Он работает нормально.

-1
28.01.2020, 02:52

Теги

Похожие вопросы