ディレクトリ名フィールドを切り捨てるには?

ディレクトリ名フィールドを切り捨てるには?

というファイルがあります140905_M01771_0112_000000000-ABBYT。 3番目のフィールドを取得したいです0112。私は試した:

cut -d _ -f 3 131230_M01771_0032_000000000-A7874 

私にエラーが発生します:

cut: 131230_M01771_0032_000000000-A7874/: Is a directory

答え1

コマンドラインでオプション以外の引数を渡す場合、cutこれはデータを読み取るファイルの名前です。cutfileのデータを処理するように要求しています。131230_M01771_0032_000000000-A7874これはデータが含まれているファイルではなくディレクトリであるため、エラーが発生します。

外部ユーティリティを呼び出す代わりに、次を使用できます。シェルの組み込みパラメータ拡張構造

dir="131230_M01771_0032_000000000-A7874"
third_field="${dir#*_}"; third_field="${third_field#*_}"; third_field="${third_field%%_*}"
echo "$third_field"

答え2

作業したい名前がわかったので、その名前を変数に渡し、変数をcutSTDINに渡すだけです。 bash、ksh、またはzshでこれを行うことができます。

% dir='140905_M01771_0112_000000000-ABBYT'          

% cut -d_ -f3 <<<"$dir"                   
0112

または、ディレクトリ名に少なくとも3_秒と1がある-場合は、for名前を簡単に設定できます。

for dir in *_*_*_*-*; do cut -d_ -f3 <<<"$dir"; done

答え3

引数は、cut実際の情報ではなく、切り取る情報を含むファイルの名前です。

カット定義以外の引数を渡さない場合は、カットする情報の標準入力を探します。

したがって、情報をcutコマンドにパイプする方が合理的です。たとえば、

ls -1d -- *_*_*_* | cut -d _ -f 3

指定lsされたコマンドは、指定された名前パターンを持つすべてのファイル(ディレクトリを含む)を一覧表示し、結果ファイルのリストはコマンドcutによってクリーンアップされます。

答え4

echo 140905_M01771_0112_000000000-ABBYT | cut -c 15,16,17,18

関連情報