regex - 从特定列的时间戳中删除毫秒

标签 regex bash sed grep

我正在尝试从两个时间戳(第 8 列和第 9 列)中删除毫秒数

1       20  2   14000   14000 11    1   10:11:56.136    10:11:56.136    0   1 

我一直在使用以下 sed 命令来删除它们:

 sed 's/\(:[0-9][0-9]\)\.[0-9]\{3\}/\1/g' 

这非常有效。但是我注意到在我的文件中还有其他时间戳,其中只有两毫秒,有些只有一毫秒:

**10:46:27.93   10:46:27.90** and some with only one millisecond 10:46:2     10:46:2

我再次运行我的 sed 命令,以便在我删除了三毫秒的文件上删除两毫秒。像这样:

sed 's/\(:[0-9][0-9]\)\.[0-9]\{2\}/\1/g'

这工作正常,因为我看到它从时间中删除了两毫秒。

问题:

运行上述命令后,我发现它有时也会修改我的其他一些列。我没有包括我的所有专栏,因为它很难阅读。我有大约 40 列。我只想修改第 8 和 9 列。

问题

我怎样才能用一个命令处理所有三种情况。当我说三种情况时,我的意思是有两毫秒、一毫秒和三毫秒。此外,如何确保我修改第 8 列和第 9 列。

非常感谢任何帮助。谢谢!!!

最佳答案

只是 awk 的初学者,如果发现效率低下,我们深表歉意。

awk '{gsub(/\.[0-9]*/,"",$8);gsub(/\.[0-9]*/,"",$9);print}' file

将单独从第 8 列和第 9 列中删除毫秒值。逻辑很简单。

  • 删除模式 之后的任何字符集。 后跟任意数量的数字

在行动中:-

$ cat file
1       20  2   14000   14000 11    1   10:11:56.136    10:11:56.136    0   1

$ awk '{gsub(/\.[0-9]*/,"",$8);gsub(/\.[0-9]*/,"",$9);print}' file

1 20 2 14000 14000 11 1 10:11:56 10:11:56 0 1

现在第 7 列更改为具有 . 值。看下面的 Action

$ cat file
1       20  2   14000   14000 11    1.1   10:11:56.136    10:11:56.136    0   1

$ awk '{gsub(/\.[0-9]*/,"",$8);gsub(/\.[0-9]*/,"",$9);print}' file

1 20 2 14000 14000 11 1.1 10:11:56 10:11:56 0 1

第 7 列保持不变。

关于regex - 从特定列的时间戳中删除毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37210019/

相关文章:

java - 奇怪的行为: export CLASSPATH=$(JARS=(./lib/*.jar); IFS=:; echo "${JARS[*]}")

bash - 在文件中查找部分并追加到该部分的底部

bash 输入参数值被设置为 0 而不是传递的值

bash - 在 docker 容器中安装 openssh-server、g++、gdb 和 gdbserver |用于 Linux 开发的 Visual C++ + Docker

java - 使用正则表达式分割字符串,但在子字符串中包含部分正则表达式

php - 有趣的 PHP 正则表达式 (preg_replace)

linux - 如何替换文本文件特定行中的未知 IP 地址

bash - sed - 循环仅替换出现中的最后一种语言 - 它应该替换所有

javascript - 在网页上进行文本替换的最简洁方法? (使用 GreaseMonkey)

java - 正则表达式帮助 : Excluding characters