Guileがこの使い方のための最良のスキームでない場合は、どちらを調べるべきですか?私は基本的にawk '{print $N}'
のGuile相当物を探しています。 Schemeがこれを行うことができない場合は、私は理由を知りたいと思います。Guileまたは他のSchemeでは、入力ファイルまたは標準入力から行のn番目の空白で区切られたフィールドを標準出力に出力する方法はありますか?
0
A
答えて
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には、区切られたテキストファイルを扱いやすくする一連の機能があります。
関連する問題
- 1. 標準入力またはファイル入力のいずれかC
- 2. Javaの標準入力から標準出力へのGZIP
- 3. inkscapeのエクスポートファイルを標準出力に出力する方法と標準入力から読み取る方法
- 4. 別の入力行(ファイルまたは標準入力から)からbashコマンドラインをフォーマットする方法
- 5. Linuxのデスクトップから起動したプログラムのデフォルトの標準入力と標準出力は何ですか?
- 6. ファイルに標準入力して標準出力に標準出力するにはどうしたらいいですか?
- 7. Log4jがファイルまたは標準出力に出力しない
- 8. 標準入力と標準出力を.Netでリダイレクトする
- 9. ファイルから入力をNetbeansの標準入力にリダイレクトする方法はありますか?
- 10. )(freopenは後に標準入力からの入力を取る
- 11. 標準出力、標準入出力オプション[ヌルヌル、ヌル、]「継承」
- 12. 標準出力からカンマ区切り値を設定する方法は?
- 13. pythonのログ出力を標準出力ではなくファイルにリダイレクトする方法はありますか?
- 14. Subprocess.communicateは改行を標準出力に出力します
- 15. 標準入力と出力を
- 16. 標準入力と出力をBashでリダイレクトする方法
- 17. RustでポリモーフィックIO(ファイルまたは標準入力)を行う方法は?
- 18. C++は - コンソール出力を維持しながらファイルに標準出力/標準エラー出力を複製
- 19. は、出力を標準出力に出力してキャプチャする方法もありますか?
- 20. 親の標準入力と標準出力を継承するリモートプロセスを.NETで呼び出すには
- 21. 私のコマンドラインから標準出力をキャッチする方法は?
- 22. ファイルから標準出力(コンソール)を読み込んで出力を他のファイルに出力する
- 23. 読書標準出力は、常に空
- 24. bashのティースクリプトの出力をファイルにし、標準出力は、タイムスタンプ
- 25. 標準入力から解析する
- 26. 同じファイルと標準出力に直接標準エラーがありますか?
- 27. 標準出力またはファイル名にCSVを書き込む
- 28. 標準出力方法
- 29. プロセスの標準出力をSLF4Jに送る方法はありますか?
- 30. のpythonロギングモジュール - ターミナル、標準出力、標準エラー出力
これは純粋なスキームで行うことができますが、標準ライブラリはあまりないのでおそらく不快になります。しかし、これを行うラケットの1ライナーがあります: '(for([l(in-lines)])(displayln(second)(string-split l)))'。 –
@AlexisKing私は答えとしてこれを受け入れるつもりですが、他の方言の中の選択肢を見ることは素晴らしいことでしょう。それは私が想像していたよりも不快ではありません。 Brian Kernighanが提示した同等のCコードよりも確かに優れています。 * for *マクロは他のスキームで利用できますか?インライン*とは何ですか? – takatakatek
いいえ、['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になります。 –