Удаление частей строки с помощью Sed - PullRequest
9 голосов
/ 24 июня 2010

У меня есть строки данных, которые выглядят следующим образом:

sp_A0A342_ATPB_COFAR_6_+_contigs_full.fasta
sp_A0A342_ATPB_COFAR_9_-_contigs_full.fasta
sp_A0A373_RK16_COFAR_10_-_contigs_full.fasta
sp_A0A373_RK16_COFAR_8_+_contigs_full.fasta
sp_A0A4W3_SPEA_GEOSL_15_-_contigs_full.fasta

Как я могу использовать sed для удаления частей строки после 4-го столбца (разделенных _) для каждой строки.Наконец, уступая:

sp_A0A342_ATPB_COFAR
sp_A0A342_ATPB_COFAR
sp_A0A373_RK16_COFAR
sp_A0A373_RK16_COFAR
sp_A0A4W3_SPEA_GEOSL

Ответы [ 6 ]

25 голосов
/ 24 июня 2010

cut лучше подходит.

cut -d_ -f 1-4 old_file

Это просто означает использование _ в качестве разделителя и сохранение полей 1-4.

Если вы настаиваете на sed:

sed 's/\(_[^_]*\)\{4\}$//'

Эта левая часть соответствует ровно четырем повторениям группы, состоящей из подчеркивания, за которым следует 0 или более не подчеркиваний. После этого мы должны быть в конце строки. Это все заменено ничем.

3 голосов
/ 24 июня 2010

AWK любит играть на полях:

awk 'BEGIN{FS=OFS="_"}{print $1,$2,$3,$4}' inputfile

или, в более общем случае:

awk -v count=4 'BEGIN{FS="_"}{for(i=1;i<=count;i++){printf "%s%s",sep,$i;sep=FS};printf "\n"}'
3 голосов
/ 24 июня 2010

Вот еще одна возможность:

sed -E -e 's|^([^_]+(_[^_]+){3}).*$|\1|'

где -E, как -r в GNU sed, включает расширенные регулярные выражения для удобства чтения.

То, что вы можете делать это в седьме, не означает, что следует Мне нравится резать намного лучше для этого.

3 голосов
/ 24 июня 2010
sed -e 's/\([^_]*\)_\([^_]*\)_\([^_]*\)_\([^_]*\)_.*/\1_\2_\3_\4' infile > outfile

Соответствует «любому числу, отличному от« _ »», сохраняя совпадения между \ (и \), за которым следует «_».Сделайте это 4 раза, затем сопоставьте что-нибудь для остальной части строки (чтобы быть проигнорированным).Заменить каждым из совпадений, разделенных '_'.

2 голосов
/ 24 июня 2010

Да, разрезать лучше, да и сопоставлять заднюю часть каждого легче.

Я наконец получил совпадение, используя начало каждой строки:

 sed -r 's/(([^_]*_){3}([^_]*)).*/\1/' oldFile > newFile
2 голосов
/ 24 июня 2010
sed -e 's/_[0-9][0-9]*_[+-]_contigs_full.fasta$//g'

Тем не менее сокращенный ответ, вероятно, быстрее и в целом лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...