Как добавить строку в файл .txt во всех строках, за исключением нескольких символов, используя sed или awk

8

У меня есть текстовый файл с именем xid.txt:

xid: SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: SC32173 id: artf398402
xid: SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

Мне нужно добавить строку «PT_» перед «SC48028», «SC32173» ... и так далее. Строка 'SC ...' может начинаться с любой комбинации, может быть 'AC ...' или 'DL ..'

Требуемый выход:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

Если вы видите вывод выше, мы не должны вставлять 'PT_' перед строками, которые начинаются с 'i', 'p', 'w' & 'numeric'. Я попробовал несколько основных команд для моего требования, используя insert / append в sed.

Субрат Саху
источник
2
Ваш вопрос по теме и приветствуется здесь, но вас может заинтересовать наш новый сайт по биоинформатике .
Тердон

Ответы:

13

С awk :

awk '$2~/^[A-Z][A-Z]/{ $2="PT_"$2 }1' xid.txt

Выход:

xid: PT_SC48028 id: artf398444
xid: indv1000 id: indv24519
xid: PT_SC32173 id: artf398402
xid: PT_SC21033 id: artf398372
xid: 1001 id: tracker4868
xid: wiki1000 id: wiki10709
xid: proj1234 id: proj12556

  • $2~/^[A-Z][A-Z]/ - если 2-е поле начинается с 2 заглавных букв

Или седь подход:

sed -i 's/^\(xid:[[:space:]]*\)\([A-Z]\{2\}[^[:space:]]*\)/\1PT_\2/' xid.txt
RomanPerekhrest
источник
это было так гладко, мгновенный ответ большое спасибо. Если я хочу добавить в существующий входной файл, что должно быть сделано?
Субрат Саху
awk '$2~/^[A-Z]{2}/{ $2="PT_"$2 }1' xid.txt > xid-tmp && mv xid-tmp xid.txtили используйте мой второй подход
RomanPerekhrest
1
@SubratSahoo Если этот ответ решил вашу проблему, пожалуйста, найдите время и примите его , нажав на флажок слева. Это пометит вопрос как ответивший и выразит благодарность на сайтах Stack Exchange.
Тердон
1
Кроме того, @SubratSahoo (и Roman) имеют более новые версии GNU awk(ту, которую вы обычно устанавливаете в системах Linux), -i inplaceкоторая позволяет вам редактировать файл на месте, как sed и perl -i.
Тердон
@terdon, да, я знаю -i inplace(я предложил унифицированный подход с mvкомандой для OP, чтобы соответствовать переносимости). Что касается Bioinformatics betaсообщества: я только что присоединился к нему. Могут ли быть задачи, связанные с программированием / обработкой Linux / Python? Как ты думаешь?
РоманПерехрест
6

опция Sed

sed -i -e 's/[A-Z][A-Z]/PT_&/' file

где

  • -i редактировать на месте
  • -e команда для выполнения
Archemar
источник