我有一个 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
我一直在玩awk
andcut
但只能打印特定位置 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 开始的所有字段。