- ベストアンサー
Unix初心者のためのファイルの指定行の標準出力方法
- Unix初心者のために、複数のファイルから指定行のみを取得し、標準出力する方法について教えてください。
- headやsedなどのコマンドを使用せずに、一行のコマンドで指定行のみを取得する方法があれば教えてください。
- ファイル名や行数も同時に出力することができれば、さらに効率的な作業ができます。対象行を増やすこともできると嬉しいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> ところで、" nawk " の " n " は、" new " > の頭文字なんですかね。 > (どうでもいいですが) はい。そのとおりです。 ふつうawkというと、このnawkのことを指すことが多いのですが、 SunOSはカタクナなまでに(古い仕様の)awkとnawkを区別して 別個のコマンドにしています。 で、nawkはawkの上位互換のものですので、awkにできて nawkにできないことはありません。 安心してnawkを使ってください。 | 欲をかいて、冷静さをうしなっていたのか、↓これでいいかな。っと思ってます。 | nawk 'FNR==2{print ARGV[++i], $0}' *.txt | grep -n rev | 「 ブサイクだ 」と言われてしまうのでしょか。 パイプの段数が深ければちょっと考えてしまいますが、 このくらいならいいのではないでしょうか。 ただ、grep -n rev が単に順番に番号をつけるだけの目的で、revがすべての入力にあるのなら nl とかを使った方がよいかもしれません。 あるいは 'FNR==2{print ++i, ARGV[i], $0}' みたいにするとか。 きちんと桁揃えとかをしたいのなら 'FNR==2{++i; printf "%3d: %s %s\n", i, ARGV[i], $0}' とprintfを使ってもいいと思います。 その辺はお好みで。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
あー、これだからSunOSのawkは(笑) とりあえずnawk 使ってください。 SunOS リファレンスマニュアル 1 : ユーザーコマンド: awk(1) http://docs.sun.com/app/docs/doc/819-1210/6n3j74jkq?a=view SunOS リファレンスマニュアル 1 : ユーザーコマンド: nawk(1) http://docs.sun.com/app/docs/doc/819-1210/6n3j74jqq?a=view awkだと、FNRやARGVを組込み変数として持ってません。
補足
> とりあえずnawk 使ってください。 good! ばっちりでした。 > awkだと、FNRやARGVを組込み変数として持ってません。 という事は、もう " awk " は不要ってことで、全て " nawk " でやっちゃっていきます。 ・・・・で問題ないいんですよね? ところで、" nawk " の " n " は、" new " の頭文字なんですかね。 (どうでもいいですが) >> 欲を言えば、行数も出力させたいです。 > この行数というのはファイル全体で何行あるかということですか? 欲をかいて、冷静さをうしなっていたのか、↓これでいいかな。っと思ってます。 nawk 'FNR==2{print ARGV[++i], $0}' *.txt | grep -n rev 「 ブサイクだ 」と言われてしまうのでしょか。 助かりました。
- sakusaker7
- ベストアンサー率62% (800/1280)
とりあえず最初の希望だけ。 awk 'FNR==2{print ARGV[++i], $0}' *.txt > 欲を言えば、行数も出力させたいです。 この行数というのはファイル全体で何行あるかということですか?
補足
ご協力ありがとうございます。 "awk"について色々学べました。 この機会に"組込み変数"と云う存在も知りました。 以下のように結果・・・ # pwd /***/**/** # bash # ls -l | awk '{ print $1 , $6 , $7 ,$9; }' | head -6 合計 -rwxrwxrwx 11月 13日 001.txt -rwxrwxrwx 11月 13日 002.txt -rwxrwxrwx 11月 13日 003.txt -rwxrwxrwx 11月 13日 004.txt -rwxrwxrwx 11月 13日 005.txt # cat ./001.txt hello bye hi! How are you? See you later. # # awk 'FNR==2{print ARGV[++i], $0}' ./*.txt # # awk 'FNR==2{print ARGV[++i], $0}' ./001.txt # # awk 'FNR==2{print $0}' ./*.txt # # awk 'FNR==2{print $0}' ./001.txt # # awk '{print ARGV[++i], $0}' ./001.txt hello bye hi! How are you? See you later. # # awk '{print ARGV[++i], $0}' ./*.txt hello bye hi! How are you? See you later. a b c d e A B C D E ; : ! $ . Sun Mon Tue Wed Thu # # awk -W version awk: 構文エラー (1 行目の周辺) awk: 処理を中止します。 (1 行目の周辺) # # awk --version (プロンプトが帰って来ないから<Ctrl+C>) ^C # もしかして・・・嫌な予感がするんですが、Versionが古すぎて、組み込み変数を認識してなくて駄目なんでしょうか。しかもVersionが不明ですし。
お礼
早い回答有難うございます! 大満足! です。 隅々と教えて頂いて感謝してます。 'FNR==2{++i; printf "%3d: %s %s\n", i, ARGV[i], $0}' が好みです。 お世話になりました。