2012-06-25 43 views
5

Một phần của đầu ra 4 cột của tôi trông như thế này:Tìm số, và loại bỏ ký tự liền kề tương đương với con số này

5 cc1kcc1kc 5 cc1kcc1kc 
5 cc2ppggg 5 cc2ppggg 
6 ccg12qqqqqqqqqqqqggg 10 ccccg11qqqqqqqqqqqggggg 
3 4qqqqcgc1q 12 cgccgccgccgc 

Tôi chỉ muốn cột thứ hai và thứ tư thay đổi, là có một cách với awk/sed để loại bỏ các con số với các ký tự bên cạnh chúng? Hoặc sẽ dễ dàng hơn/tốt hơn khi sử dụng tập lệnh perl để thực hiện phép chuyển đổi này?

Các kết quả đầu ra sẽ giống như thế này:

5 ccccc 5 ccccc 
5 ccggg 5 ccggg 
6 ccgggg 10 ccccgggggg 
3 cgc 12 cgccgccgccgc 

Trả lời

4

Lấy câu hỏi theo nghĩa đen, điều này loại bỏ các n ký tự tiếp theo từ các lĩnh vực 2 và 4 cho bất kỳ n nhúng trong lĩnh vực này.

perl -lane 'for $i (1, 3) {@nums = $F[$i] =~ /(\d+)/g; for $num (@nums) {$F[$i] =~ s/$num.{$num}//}}; print join("\t", @F)' 

Các câu trả lời khác xóa số và tất cả ký tự theo sau giống nhau.

Để minh họa sự khác biệt giữa câu trả lời của tôi và những người khác, sử dụng các đầu vào sau:

6 ccg8qqqqqqqqqqqqggg 10 ccccg3qqqqqqqqqqqggggg 

đầu ra phiên bản của tôi này:

6 ccgqqqqggg  10  ccccgqqqqqqqqggggg 

trong khi sản lượng của họ này:

6 ccgggg 10 ccccgggggg 
3

Với perl:

perl -pe 's/\d+([^\d\s])\1*//g' 
+0

+1 vì việc này hoàn thành công việc, nhưng một chút giải thích sẽ tốt đẹp. – simbabque

+0

Ok. Tùy chọn '-p' làm cho Perl giả sử vòng lặp sau xung quanh mã của bạn (tùy chọn' -e' và một lớp lót), làm cho nó lặp qua các đối số giống như 'sed'. Và mô tả regexp thấy trong [câu trả lời về 'sed'] (http://stackoverflow.com/a/11186538/1186729). –

+2

Điều đó sẽ xóa "10" và "12" nằm trong cột 3 ở hàng 3 và 4. –

2

Với sed:

sed 's/[0-9]\+\([a-z]\)\1*//g' 

Trận đấu tìm thấy bất kỳ chuỗi các chữ số ([0-9]+) tiếp bằng bất kỳ thư nào ([a-z]). \1* khớp với mọi lần xuất hiện tiếp theo của ký tự đó. Trình sửa đổi /g (toàn cục) đảm bảo rằng thay thế được thực hiện nhiều lần trên mỗi dòng.

1

Điều này có thể phù hợp với bạn (GNU sed):

sed 'h;s/\S*\s*\(\S*\).*/\1/;:a;s/[^0-9]*\([0-9]\+\).*/sed "s|\1.\\{\1\\}||" <<<"&"/e;ta;H;g;/\n.*\n/bb;s/\(\S*\s*\)\{3\}\(\S*\).*/\2/;ba;:b;s/^\(\S*\s*\)\(\S*\)\([^\n]*\)\n\(\S*\)/\1\4\3/;s/\(\S*\s*\)\n\(.*\)/\2/' file 
Các vấn đề liên quan