• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:unixのawkについて)

Unixのawkを使用してフルパスをディレクトリとファイル名に分割する方法

このQ&Aのポイント
  • Unixのawkを使用してフルパスをディレクトリとファイル名に分割する方法について説明します。
  • awkコマンドを使用して、フルパスからディレクトリとファイル名を抽出する方法を詳しく解説します。
  • 具体的な例を挙げながら、awkを使ってフルパスをディレクトリとファイル名に分ける手順を説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.3

プログラミング以前の問題があるように思います。 >①/aaa/bbb/ccc この ccc は、見た目にファイル名であるかディレクトリであるかわかりません。 もし ccc がディスク上でディレクトリであれば、 「/aaa/bbb/ccc」と「(ヌル文字列)」に分けるのが正しいことになります。 その様な心配をしなくて良いのでしょうか。 ---- 指定された「フルパス」が必ずファイル名で終わっていると保証できるなら、ディレクトリ名は最後の「/」の手前まで、それ以降をファイル名、として取り出せば良いことになります。 >echo "/111/222/333/hoge.txt" | gawk '{sub(/\/.*$/,"",$0); print}' >としてみたのですが、 >ディレクトリだけを取り出そうとしたのですが上手くいきません。 これは、正規表現の性質として「"*"はできるだけ長くマッチする」ためです。 "/\/.*$/" を "/111/222/333/hoge.txt" に適用した場合、マッチするのは最初の「/」からお尻($)まで、すなわち文字列全体になってしまいます。 なので、「スラッシュ以外の任意長の文字列」とすれば、 echo "/111/222/333/hoge.txt" | gawk '{sub(/[^/]*$/,"",$0); print}' ファイル名の部分のみを削除できるでしょう。 まあこれだとディレクトリの末尾に / が残るので、マッチパターンを「スラッシュ + スラッシュ以外の任意長の文字列」にすれば echo "/111/222/333/hoge.txt" | gawk '{sub(/\/[^/]*$/,"",$0); print}' 「/111/222/333」が得られると思います。 そして逆にファイル名を得る方では、「最長マッチ」の性質を使い、 echo "/111/222/333/hoge.txt" | gawk '{sub(/^.*\//,"",$0); print}' これでファイル名だけになるんじゃないでしょうか。

abc999xyz
質問者

補足

ありがとうございます。 >もし ccc がディスク上でディレクトリであれば、 >「/aaa/bbb/ccc」と「(ヌル文字列)」に分けるのが正しいことになります。 >その様な心配をしなくて良いのでしょうか。 確かにあります。 ですが、拡張子なしだとファイルかディレクトリかわかりません。 cccがディレクトリかファイルかわからないので判断が必要ということですね。 どうなりますか。

その他の回答 (3)

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.4

>cccがディレクトリかファイルかわからないので判断が必要ということですね。 >どうなりますか。 すみません、perlだと「ファイルテスト演算子」っていうのがあって、 if (-f $path) print "通常ファイル"; if (-d $path) print "ディレクトリ"; みたいな判別が出来たんですが、awkは主目的がテキスト処理言語であるせいか、そんなテストはできないようですね(汗 フォルダ関連の命令があれば、「chdir $path」をしてみてカレントディレクトリを移動できるか、みたいな判別法もできたかもしれませんが、そんなものも無いようです。 そうなると(awkでは)、「フルパス末尾はファイル名で終わっている」と仮定するしかない気がします…余計な申し出失礼しました。

abc999xyz
質問者

お礼

ありがとうございます。 疑問や指摘は大変参考になります。

  • agehage
  • ベストアンサー率22% (2752/12072)
回答No.2

awkじゃなきゃダメ? xargsでよければ以下のようにご希望の状況になるかと echo aaa/bbb/ccc | xargs -n1 basename → ccc echo aaa/bbb/ccc | xargs -n1 dirname → aaa/bbb echo /111/222/333/hoge.txt | xargs -n1 basename → hoge.txt echo /111/222/333/hoge.txt | xargs -n1 dirname → /111/222/333 echo /hoge/foo/bar/dk@0:1 | xargs -n1 basename → dk@0:1 echo /hoge/foo/bar/dk@0:1 | xargs -n1 dirname → /hoge/foo/bar

abc999xyz
質問者

お礼

ありがとうございます。 例として echo /111/222/~ | awk とかきましたが、 処理結果をawkに渡しているのでawkとなります。

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.1

awkでやらなければいけない理由はありますか? なければ、dirnameとbasenameで足りると思います。 $ dirname /hoge/foo/bar/dk@0:1 /hoge/foo/bar $ basename /hoge/foo/bar/dk@0:1 dk@0:1

abc999xyz
質問者

お礼

ありがとうございます。 例として echo /111/222/~ | awk とかきましたが、 処理結果をawkに渡しているのでawkとなります。

関連するQ&A