SASでリスト出力したテキストファイルに対して、grepコマンドを実行し「バイナリー・ファイル(標準入力)は一致しました」と出力される原因と解決方法

SASの話というよりは、Linux の grepコマンドの話。

SASでリスト出力したテキストファイル(.lst) に対して、grepコマンドを実行すると、「バイナリー・ファイル(標準入力)は一致しました」と出力されて、実行が終了されてしまう問題が発生しました。一部のリストファイルはきちんとgrepコマンドが実行されるのですが、理由が分からず右往左往してしまいました。

どうやら、grepコマンドは、バイナリファイルと思われるコードがあると、正常に動作してくれなくなるらしい(余計なことを…)。なので、明示的にテキストファイルと認識させるために、以下の3つのいずれかのオプションを付ける必要があります。

  1. -a
  2. --text
  3. --binary-files=text

これにより、テキストファイルと認識されるため、正常にgrepコマンドが実行されます。

そもそも、なぜリストファイルがバイナリファイルと認識されてしまったのか。これは、複数回リスト出力したときに発生します。

data TEST ;
  A = 1 ;
run ;

title "TEST 1" ;
proc print data=TEST ; run ;
title "TEST 2" ;
proc print data=TEST ; run ;

リストをテキスト出力したとき、人間の目には見えませんが、表と表の間に制御コード 0x0c(改ページ)が出力されています。この制御コードが、grepコマンドにリストファイルをバイナリファイルと思わせた原因でした。

参考サイト

  1. Linuxのgrep検索で「バイナリー・ファイル(標準入力)は一致しました」と表示される原因と解決方法 / r_nobuホームページ

2015/05/18 追記:ページ区切りに使われている改ページを変更する方法を発見しました!

ページの区切り文字を 0x0c (改ページ) から、任意の文字に変更するオプション formdlim

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意