
こんにちは。現在、次のコードを実行しようとしています。変数 DATE 内に YYYY/MM/DD 形式の文字列を保存しています。cut コマンドを使用して年を抽出しようとしています。ファイルまたはディレクトリではないというエラーが表示されます。変更を加えることや、別の方法はありますか?
for file in ~/filesToSort/*
do
DATE=$(head -1 $file | tr "-" "/")
echo "${DATE}"
YYYY=$(cut -c1-4 accounts $DATE)
#echo "${YYYY}"
done
ありがとう
答え1
このcut
ユーティリティは標準入力ストリームからデータを読み取りますが、引数として指定された文字列に対しては操作を行いません。
したがって、を使用するにはcut
、標準入力でデータを渡す必要があります。
YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )
ただし、ループ内では、非常に遅くなります。代わりに、組み込みのパラメータ置換を使用して、文字列/
の最初の部分以降のすべてを削除します$DATE
。
YYYY=${DATE%%/*}
$DATE
これは、シェル パターン に一致する最長の接尾辞文字列を から削除します/*
。文字列が の場合2021/10/21
、 を返します2021
。
ディレクトリ内のすべてのファイルの最初の4文字を取得するには(これが私が信じる現在のコードが実行しようとしている操作を実行するには、次のようにしますsed
。
for name in "$HOME"/filesToSort/*; do
sed -e 's/\(....\).*/\1/' -e q "$name"
done
これは各ファイルの最初の行を読み取り、その行の内容をその行の最初の 4 文字に置き換え、結果を端末に出力してから終了します。
答え2
シェルがサポートしている場合は、Here Strings ( ) を使用できます<<<
。man bash
Here Strings
A variant of here documents, the format is:
[n]<<<word
The word undergoes tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and quote removal. Path‐
name expansion and word splitting are not performed. The result is
supplied as a single string, with a newline appended, to the command
on its standard input (or file descriptor n if n is specified).
あなたの場合は、次のようにします。
for file in ~/filesToSort/*
do
date=$(head -1 "$file" | tr "-" "/")
echo "${DATE}"
yyy=$(cut -c1-4 <<< "$date")
echo "$yyy"
done
答え3
古き良きものを使ったもう一つのawk
for file in *; do
awk -F'-' 'NR==1 {print $1}' $file
done
-F '-'
awkに-
区切り文字としてを使用するように指示しますNR==1
awkに各ファイルの最初の行だけを読み込むように指示する{print $1}
区切り文字で区切られた最初のフィールドのみを印刷します