
というファイルがあります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
これはデータを読み取るファイルの名前です。cut
fileのデータを処理するように要求しています。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
作業したい名前がわかったので、その名前を変数に渡し、変数をcut
STDINに渡すだけです。 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