csv заменить двухсимвольную строку на трехсимвольную

Я хотел бы заменить несколько строк другими (например, «GG» на «GGX», «GG» на «GGX», «FG» на «FGX» и т. д.) в первом столбце большого CSV-файла, используя команда оболочки.

Я знаю, что мне нужно что-то вроде

big.csv shell_commands big.csv

но я не знаю awk или sed


person Yoda    schedule 23.01.2013    source источник


Ответы (4)


Используя sed, замена всех экземпляров «GG» на «GGX» в big.csv будет выглядеть так:

sed 's/^GG/GGX/g' big.csv >big_translated.csv

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

sed 's/^GG/GGX/g; s/^FG/FGX/g' big.csv >big_translated.csv

Символ ^ означает начало строки и гарантирует, что мы редактируем только первое поле CSV.

person cmh    schedule 23.01.2013
comment
Спасибо, я хочу сделать это только для строк первого столбца в csv, также заменит ли 's/GG/GGX/g' GG? - person Yoda; 23.01.2013
comment
s/GG/GGX/g преобразует GG в GGX. s/GG /GGX/g преобразует GG в GGX. - person cmh; 23.01.2013

awk 'BEGIN{ r["GG"] = "GGX"; r["FG"] = "FGX" } 
    { for( k in r ) if( gsub( k, r[k], $1 ) break } 1' input-file

Перерыв делается для предотвращения множественных замен.

person William Pursell    schedule 23.01.2013

Попробуйте это (при условии, что у вас есть одно вхождение строк)

awk '{sub("GG","GGX",$0); sub("FG","FGX",$0); print}' temp.txt

person Mirage    schedule 24.01.2013
comment
Это здорово и работает, когда я использую его в оболочке. Однако я не могу заставить его работать как системную команду R. Я пробовал использовать shQuote(), без особого удовольствия. Спасибо за помощь. - person Yoda; 24.01.2013
comment
Хорошо, я заставил его работать в R, при этом многие части были отправлены в paste(). Однако у меня есть такие строки, как FGP, измененные на FGXP. Есть ли способ обойти это, используя оператор if для количества символов в поле. - person Yoda; 24.01.2013

Как насчет этого?

sed -i "s/^\(..\),/\1X,/" big.csv

Или, если у вас есть несколько пробелов, это:

sed -i "s/^\([^ ][^ ][ ]*\),/\1X,/" big.csv
person Gargamel    schedule 24.01.2013