У меня есть строки данных, которые выглядят следующим образом:
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-го столбца (разделенных _) для каждой строки.Наконец, уступая:
sed
sp_A0A342_ATPB_COFAR sp_A0A342_ATPB_COFAR sp_A0A373_RK16_COFAR sp_A0A373_RK16_COFAR sp_A0A4W3_SPEA_GEOSL
cut лучше подходит.
cut
cut -d_ -f 1-4 old_file
Это просто означает использование _ в качестве разделителя и сохранение полей 1-4.
Если вы настаиваете на sed:
sed 's/\(_[^_]*\)\{4\}$//'
Эта левая часть соответствует ровно четырем повторениям группы, состоящей из подчеркивания, за которым следует 0 или более не подчеркиваний. После этого мы должны быть в конце строки. Это все заменено ничем.
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"}'
Вот еще одна возможность:
sed -E -e 's|^([^_]+(_[^_]+){3}).*$|\1|'
где -E, как -r в GNU sed, включает расширенные регулярные выражения для удобства чтения.
То, что вы можете делать это в седьме, не означает, что следует Мне нравится резать намного лучше для этого.
sed -e 's/\([^_]*\)_\([^_]*\)_\([^_]*\)_\([^_]*\)_.*/\1_\2_\3_\4' infile > outfile
Соответствует «любому числу, отличному от« _ »», сохраняя совпадения между \ (и \), за которым следует «_».Сделайте это 4 раза, затем сопоставьте что-нибудь для остальной части строки (чтобы быть проигнорированным).Заменить каждым из совпадений, разделенных '_'.
Да, разрезать лучше, да и сопоставлять заднюю часть каждого легче.
Я наконец получил совпадение, используя начало каждой строки:
sed -r 's/(([^_]*_){3}([^_]*)).*/\1/' oldFile > newFile
sed -e 's/_[0-9][0-9]*_[+-]_contigs_full.fasta$//g'
Тем не менее сокращенный ответ, вероятно, быстрее и в целом лучше.