2010-02-14 32 views
5

Bazen veri dosyasında sütunları ayıklamak ve/veya geri almak için AWK kullanıyorum.

awk '{print $2,",",$1}' filename.txt 

Emacs Lisp'i kullanarak aynı işlemi nasıl yapabilirim?

(defun awk (filename col1 &optional col2 col3 col4 col5) 
    "Given a filename and at least once column, print out the column(s) 
values in the order in which the columns are specified." 
... 
) 
;; Test awk 
(awk "filename.txt" 1); Only column 1 
(awk "filename.txt" 2 1); Column 2 followed by column 1 
(awk "filename.txt" 3 2 1); Columns 3,2 then 1 

Numune filename.txt:

a b c 
1 2 5 

Örnek çıktı:

b , a 
2 , 1 

cevap

2

Bunu nasıl kullanmayı düşünüyorsunuz? Bir komut satırı komut dosyası olarak kullanmayı planlıyor musunuz? Bu durumda, bu hello world question gibi paketlemeniz gerekir.

Veya,

Bu kod yapılan temel alır ... bu durumda muhtemelen yeni bir tampon içerisinde çıkışı istiyorum, etkileşimli bunu kullanarak planlama vardır. Kullanım modelinize uyacak şekilde güncellemeniz gerekir.

(defun awk (filename &rest cols) 
    "Given a filename and at least once column, print out the column(s) values 
in the order in which the columns are specified." 
    (let* ((buf (find-file-noselect filename))) 
    (with-current-buffer buf 
     (while (< (point) (point-max)) 
     (let ((things (split-string (buffer-substring (line-beginning-position) (line-end-position)))) 
       (c cols) 
       comma) 
      (while c 
      (if comma 
       (print ", ")) 
      (print (nth (1- (car c)) things)) 
      (setq comma t) 
      (setq c (cdr c))) 
      (print "\n") 
      (forward-line)))) 
    (kill-buffer buf))) 
+0

Duydum 'bununla akım-buffer' should "kaydetme-gezi" ve "set-buffer" yerine kullanılmalıdır. – pheaver

+0

"(-1+ ...)" bir yazım hatası mı? –

+0

@melling Evet, teşekkürler. –

0

Trey'in çözümünü aldım ve bir Unix kabuğundan çalışan bir komut dosyası hazırladım. komut satırı args-left sonuçlarının nasıl uygun bir parametreye dönüştürüleceğinden emin olmadığım için komut satırı parametrelerini almaz.

 

#!/usr/bin/emacs --script 

;; ./awk.el; # Change the last line of this file to contain the desired values. 
;; 
(defun awk (filename &rest cols) 
    "Given a filename and at least once column, print out the column(s) values 
in the order in which the columns are specified." 
    (let* ((buf (find-file-noselect filename))) 
    (with-current-buffer buf 
     (while (< (point) (point-max)) 
     (let ((things (split-string (buffer-substring (line-beginning-position) 
          (line-end-position)))) 
       (c cols) 
       comma) 
      (while c 
      (if comma 
       (princ ", ")) 
      (princ (nth (1- (car c)) things)) 
      (setq comma t) 
      (setq c (cdr c))) 
      (princ "\n") 
      (forward-line)))) 
    (kill-buffer buf))) 

(awk "/tmp/foo.txt" 2 1) 
 
0

kullanımı dash.el ve s.el gelen işlevler: Varsayılan

(defun print-columns (s &rest is) 
    (s-join "\n" 
      (--map (s-join ", " 
         (-select-by-indices is (cons it (s-split " " it t)))) 
       (s-lines s)))) 

(print-columns "a b c\n1 2 3" 3 2 1 0) ; output: 
;; c, b, a, a b c 
;; 3, 2, 1, 1 2 3 

, (yeni satır ile ayrılmış) bir kayıt dizi olarak davranır metin awk, alanlar bir dizi; her bir kaydı (boşluk ile ayrılmış) . Yani yukarıdaki örnekte c, a b c kayıt alanının bir alanıdır. print-columns işlevi bir metin alır, s-lines ile yeni satırlara ayırır, her kayıttan belirli alanları seçer, s-join ile bir virgül ile birleştirir, sonucu yeni satırlarla birleştirir. En önemli işlev indekslerinin listesinde aynı sırada onların endeksler ve getiri tarafından bir listeden elemanlarını seçer dash 'ın -select-by-indices şöyledir:

(-select-by-indices '(2 1 0) '(a b c d e)) ; => (c b a)