2010-06-24 25 views
6

Tôi có dòng dữ liệu mà trông như thế này:Phụ Xóa Chuỗi Với Sed

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 

Làm thế nào tôi có thể sử dụng sed để xóa các phần của chuỗi sau cột thứ 4 (_ tách ra) cho mỗi dòng. Cuối cùng sinh lợi:

sp_A0A342_ATPB_COFAR 
sp_A0A342_ATPB_COFAR 
sp_A0A373_RK16_COFAR 
sp_A0A373_RK16_COFAR 
sp_A0A4W3_SPEA_GEOSL 

Trả lời

19

cut phù hợp hơn.

cut -d_ -f 1-4 old_file 

Điều này có nghĩa là sử dụng _ làm dấu phân cách và giữ trường 1-4.

Nếu bạn nhấn mạnh vào sed:

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

phía bên tay trái này phù hợp chính xác bốn lần lặp lại của một nhóm, bao gồm một gạch tiếp theo 0 trở lên không dấu gạch dưới. Sau đó, chúng ta phải ở cuối dòng. Đây là tất cả thay thế bằng không có gì.

1
sed -e 's/_[0-9][0-9]*_[+-]_contigs_full.fasta$//g' 

Câu trả lời cắt có lẽ nhanh hơn và tốt hơn.

1

Có, cách cắt là tốt hơn và phù hợp với mặt sau của mỗi cách dễ dàng hơn.

cuối cùng tôi đã có một trận đấu bằng cách sử dụng đầu của mỗi dòng:

sed -r 's/(([^_]*_){3}([^_]*)).*/\1/' oldFile > newFile 
2
sed -e 's/\([^_]*\)_\([^_]*\)_\([^_]*\)_\([^_]*\)_.*/\1_\2_\3_\4' infile > outfile 

trận đấu "bất kỳ số lượng không phải là '_'", tiết kiệm những gì đã xuất hiện giữa \ (và \), tiếp theo là '_'. Làm điều này 4 lần, sau đó kết hợp bất cứ điều gì cho phần còn lại của dòng (để được bỏ qua). Thay thế với mỗi trận đấu được phân tách bằng '_'.

2

Đây là một khả năng:

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

nơi -E, như -r trong GNU sed, bật biểu thức thông thường kéo dài để có thể đọc.

Chỉ vì bạn có thể làm điều đó trong sed, tuy nhiên, không có nghĩa là bạn nên. Tôi thích cắt tốt hơn nhiều cho việc này.

1

AWK thích chơi trong các lĩnh vực:

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

hay tổng quát hơn:

awk -v count=4 'BEGIN{FS="_"}{for(i=1;i<=count;i++){printf "%s%s",sep,$i;sep=FS};printf "\n"}' 
Các vấn đề liên quan