删除行的特定部分

删除行的特定部分

我有一个 csv 文件,其中包含以下格式的多行时间戳时:分:SS:女士
例如:

00.00.07.38    
00.00.08.13    
00.00.08.88

这个时间与我无关,所以我想删掉它。如何使用 bash 从文件的每一行中删除 HH。

我可以从文件中逐行读取

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

我一直在玩awkandcut但只能打印特定位置 ex HH 等

但是如何在不创建新文件的情况下仅删除该行中的 HH 呢?

答案1

只需使用sed

sed -i.bak 's/[0-9]\{2\}.//' myfile

这将删除后面跟有句点的两个起始数字,并替换您的文件,将原始文件另存为备份 ( 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点 ( .) 允许 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 开始的所有字段。

相关内容