cutや他の同様のコマンドを使用して日付と時刻を取得する方法を尋ねたい。デフォルトでは、次$line
から検索しますfor loop
。
for line in $(cat $file);
do
getdatetime=$(echo $line | cut -f4 -d,)
done
サンプル値は次のとおりです$line
。
883427446627317909,1114259,1573178423,2019-11-08 02:00:23,RD,4.7,0,351442429
ファイルには、$file
例に似た複数行が含まれています$line
。
予想される値は次のとおりですgetdatetime
。
2019-11-08 02:00:23
しかし、日付だけがわかります。
2019-11-08
cut
日付と時刻を抽出する1行のコマンドはありますか? forループの構造を保存する必要があります。ありがとうございます。
答え1
引用符のないコマンド置換を繰り返すと、$(cat $file)
すべてのコマンドを繰り返します。性格cat $file
単語は、スペース(デフォルトではスペース、タブ、または改行)で区切られた任意の項目にすることができます。これは$file
行の1つに対して
883427446627317909,1114259,1573178423,2019-11-08 02:00:23,RD,4.7,0,351442429
883427446627317909,1114259,1573178423,2019-11-08
2つの単語が得られます02:00:23,RD,4.7,0,351442429
(つまり、ループはこの行に対して2回繰り返されます)。つまり、行の2019-11-08
最初の繰り返しと0
2番目の繰り返しが行われます。
解決策はいいえコマンド置換を引用すると、ループが繰り返されます。一度ファイルの内容全体を読みます$line
。解決策はいいえIFS
次のように改行文字に設定してください。優雅ではないcut
(繰り返しごとに1回呼び出す必要があります)。
代わりに、目的のデータを解析して一度の呼び出しで読みますcut
。
while IFS= read -r datetime; do
# use "$datetime" here
done < <( cut -d, -f4 "$file" )
while
これはプロセス置換を使用してループから読み取る入力ストリームを生成します。このストリームのデータには、ファイル名がカンマで区切られた4番目のフィールドが含まれています$file
。
または、while
サブシェルでループを使用してください。
cut -d, -f4 "$file" |
while IFS= read -r datetime; do
# use "$datetime" here
done
使用すると、awk
廃棄物がよりきれいになります(あなたは必要何らかの理由で日付/時刻値をシェル変数として使用する場合):
awk -F , '{ datetime = $4; ... more code here using the datetime variable }' "$file"
関連読書:
答え2
cut
実際には、次のことがなくてもできます。
while IFS=, read _ _ _ stamp _ ; do
echo "do something with $stamp here"
done < "$file"
少し分析すると、次のようになります。
IFS=,
一時的にレコード区切り記号を次に設定します。,
read _ _ _ stamp _
フィールド1-3と5を1回限りの変数に保存し、フィールド4(日付/時刻)を次のようにキャプチャします。stamp
< "$file"
ソースファイルを読み込みます(コマンドでread
キャプチャされます)。
この猫のスキンを再割り当てするもう1つの方法は、配列を各行で埋めることです(これは確かにbashで動作し、他のシェルではそれをサポートしていないか、別の方法で実装できます)。
while IFS=, read -a line ; do echo "${line[3]}" ; done < "$file"