行の特定の部分を削除

行の特定の部分を削除

次の形式の複数行のタイムスタンプを含む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だが、cutHHなどの特定の場所だけを印刷することができます。

しかし、新しいファイルを作成せずにその行の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"

IFSdot( ) を使用すると、.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 から始まるすべてのフィールドを抽出します。

関連情報