2017-09-07 2 views
0

Guileがこの使い方のための最良のスキームでない場合は、どちらを調べるべきですか?私は基本的にawk '{print $N}'のGuile相当物を探しています。 Schemeがこれを行うことができない場合は、私は理由を知りたいと思います。Guileまたは他のSchemeでは、入力ファイルまたは標準入力から行のn番目の空白で区切られたフィールドを標準出力に出力する方法はありますか?

+0

これは純粋なスキームで行うことができますが、標準ライブラリはあまりないのでおそらく不快になります。しかし、これを行うラケットの1ライナーがあります: '(for([l(in-lines)])(displayln(second)(string-split l)))'。 –

+0

@AlexisKing私は答えとしてこれを受け入れるつもりですが、他の方言の中の選択肢を見ることは素晴らしいことでしょう。それは私が想像していたよりも不快ではありません。 Brian Kernighanが提示した同等のCコードよりも確かに優れています。 * for *マクロは他のスキームで利用できますか?インライン*とは何ですか? – takatakatek

+0

いいえ、['for'](http://docs.racket-lang.org/reference/for.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for%29 %29)の正確な形式は、['in-lines'](http://docs.racket-lang.org/reference/sequences.html#%28def._%28%28lib)と同様に、ラケット特有の機能です._racket%2Fprivate%2Fbase..rkt%29._in-lines%29%29)。後者は、ポート内の行を繰り返し処理するラケット "シーケンス"のコンストラクタです。ポートが指定されない場合、デフォルトは '(current-input-port)'、別名stdinになります。 –

答えて

0

GuileはI/Oを2.0から2.2に少し変更しました。これはr6rs I/Oを使用しています(うまくいけば)両方で同じように動作しますが、2.2でテストしていません。

さらに最適化することができます。

#!/usr/bin/guile \ 
-e start -s 
!# 

(use-modules (rnrs io ports)) 

;;; Reads one line from current-input-port and prints the field indicated by 
;;; field-num. If the line does not have enough fields, it prints a newline. 
;;; Returns the field, an empty string, or #f if end of file is reached. 
(define (get-field field-num) 
    (let ((line (get-line (current-input-port)))) 
    (if (eof-object? line) 
     #f 
     (let ((fields (string-tokenize line))) 
      (if (< field-num (length fields)) 
       (let ((field (list-ref fields field-num))) 
       (put-string (current-output-port) 
          (string-append field "\n")) 
       field) 
       (and (put-string (current-output-port) "\n") 
        "")))))) 

;;; Repeat get-field until until end of file is reached 
(define (get-all-fields field-num) 
    (if (get-field field-num) 
     (get-all-fields field-num) 
     #f)) 

(define (start args) 
    (if (and (> (length args) 1) 
      (integer? (string->number (list-ref args 1)))) 
     (get-all-fields (1- (string->number (list-ref args 1)))) 
     (display (string-join 
       `("Usage:" ,(list-ref args 0) "<field-number>\n") 
       " ")))) 
+0

これはうまくいくと思われ、役立つはずです。なぜシバンラインのライン継続?ありがとう。 – takatakatek

+0

Guileのマニュアルでこれが推奨されています。明らかに、POSIXはシバン行については何も言わず、コマンドの後に複数のものがあると、混在した結果が得られます。私が正しく理解していれば、複数の議論があるときに継続を使うことは、実際には「より移植性が高い」ことです。 –

0

私のブログでは、an essayには、区切られたテキストファイルを扱いやすくする一連の機能があります。

関連する問題