Добавить префикс к первому столбцу файла с помощью awk

У меня есть пара сотен файлов, которые я хочу обработать с помощью xargs. Все они нуждаются в исправлении их первого столбца.

Поэтому мне нужна команда awk для добавления префикса «ID_» к первому столбцу файла (кроме первой строки заголовка). Кто-нибудь может мне с этим помочь?

Что-то по линии:

gawk -f ';' "{$1='ID_' $1; print $0}" file.csv > file_processed.csv

Хотя я не специалист по командованию. И я бы предпочел иметь некоторую обработку на месте, а не делать копию каждого файла. Предварительно я сделал это в VIM, но тогда у меня был только один файл.

:%s/^-/ID_/

Я надеюсь, что кто-то может помочь мне здесь.


person CodingButStillAlive    schedule 06.02.2018    source источник


Ответы (2)


gawk 'BEGIN{FS=";"; OFS=";"} {if(NR>1) $1="ID_"$1; print}' file.csv > file_processed.csv

FS и OFS задают разделители полей ввода и вывода соответственно.

NR>1 проверяет, больше ли номер текущей строки 1, поэтому мы не изменяем строку заголовка.

Вы также можете изменить файл на месте с помощью опции -i inplace:

gawk -i inplace 'BEGIN{FS=";"; OFS=";"} {if(NR>1) $1="ID_"$1; print}' file.csv

Изменить

После разработки исходного вопроса вот окончательная версия:

gawk -i inplace 'BEGIN{FS=OFS=";"} NR>1{sub(/^-/,"ID_",$2)} 1' file.csv

который заменяет - в начале второго столбца на ID_. Действие NR>1 применяется ко всем строкам, кроме первой (заголовка). 1 вызывает действие печати по умолчанию по умолчанию.

person Joe    schedule 06.02.2018
comment
Оказывается, мне нужно сделать операцию замены - в ID_ для префикса значений столбца, и что целью этой операции является второй, а не первый столбец: - person CodingButStillAlive; 06.02.2018
comment
Я пытаюсь gawk -i inplace 'BEGIN{FS=";"; OFS=";"} {if(NR>1) $2=gsub("^-", "ID_", $2); print}' file.csv, но это не работает должным образом. - person CodingButStillAlive; 06.02.2018
comment
[g]sub() изменяет переменную на месте, поэтому вам не нужно присваивать, таким образом: {if(NR>1) sub(/^-/, "ID_", $2); print} - person Joe; 06.02.2018
comment
Более неловко - 'BEGIN{FS=OFS=";"} NR>1{$1="ID_"$1} 1', но на самом деле вам, вероятно, нужно только 'NR>1{$0="ID_"$0} 1'. - person Ed Morton; 07.02.2018

Если вы просто хотите что-то сделать, в частности добавить префикс в первое поле, это ничем не отличается от добавления префикса ко всей строке.

Таким образом, вы можете просто awk '$0 = "ID_" $0' file.csv работать. Если вы хотите, чтобы он «менялся на месте», вы можете:

awk '$0="ID_"$0' csv >/tmp/foo && mv /tmp/foo file.csv

Вы также можете использовать sed:

sed -i 's/^/ID_/' file

-i выполняет «модификацию на месте»

Вы упомянули vim и дали s/^-/ID_/ cmd, он не добавляет префикс (ID_), он заменяет ведущее - на ID_, они разные.

person Kent    schedule 06.02.2018
comment
Ты прав. Это моя ошибка. Мне действительно нужно выполнить команду замены VIM сейчас для многих файлов. Итак, это действительно замена ведущего -, а не просто конкатенация. Извините за путаницу, и большое спасибо за вашу помощь! - person CodingButStillAlive; 06.02.2018