次の形式の複数行のタイムスタンプを含むCSVファイルがあります。時:分:SS:Ms。
たとえば、
00.00.07.38
00.00.08.13
00.00.08.88
今回は私とは関係ないので削除したいです。 Bashを使用してファイル内のすべての行からHHを削除する方法
ファイルから1行ずつ読み取ることができます
while IFS=, read col1
do
#remove HH from every line
#awk -F '[.]' '{print $1}' <<< $col1 #only prints one portion of time
#echo $col1 | cut -d"." -f2 | cut -d"." -f3 | cut -d"." -f4
done < $file
私は遊んawk
だが、cut
HHなどの特定の場所だけを印刷することができます。
しかし、新しいファイルを作成せずにその行のHHのみを削除するにはどうすればよいですか?
答え1
ただ使用してくださいsed
:
sed -i.bak 's/[0-9]\{2\}.//' myfile
これにより、ピリオドが付いた2つの開始数字が削除され、ファイルが置き換えられ、元のファイルがバックアップ(myfile.bak
)として保存されます。
答え2
たぶん最善の解決策ではありませんが、うまくいきます
一時ファイルを作成し、後で元のファイル名に名前を変更します。
function fixTime() {
file="zipstream_test/timeLog.csv"
tmpFile="zipstream_test/timeTmp.csv"
#Remove HH from file, ie remove first 3 chars
sed 's/^.\{3\}//g' $file > $tmpFile
rm $file
mv $tmpFile $file
}
fixTime
答え3
スクリプトはほぼ完成しました。
file=filename
while IFS=. read h m s n
do echo "$m.$s.$n"
done < "$file"
IFS
dot( ) を使用すると、.
read( < "$file"
) が入力を複数の部分に分割できます。この部分は h、m、s、n に割り当てられます。その後、必要な部分だけを印刷します。実際、より簡単な解決策は次のとおりです。
file=filename
while IFS=. read h m
do echo "$m"
done < "$file"
変数hは最初の部分を取得し、変数mは残りの部分を取得して印刷します。
答え4
~から切るタグの一つです。
$ cut -d . -f 2- file
00.07.38
00.08.13
00.08.88
cut
これにより、脅威ファイルがドットで区切られた一連のフィールドになります。各行について、フィールド 2 から始まるすべてのフィールドを抽出します。