我试图从两个时间戳(第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命令,以便删除我删除了3毫秒的文件上的两毫秒。像这样:
sed 's/\(:[0-9][0-9]\)\.[0-9]\{2\}/\1/g'
这样可以正常工作,因为我发现它从那时起消除了两毫秒。
问题:
运行上面的命令后,我发现它有时也会修改我的其他一些列。我没有包括我的所有专栏,因为它很难阅读。我有大约40列。我只想修改第8列和第9列。
问题
如何使用一个命令处理所有三种情况。当我说三种情况时,我指的是有两毫秒,一毫秒和三毫秒。另外,如何确保仅修改第8列和第9列。
非常感谢任何帮助。谢谢!!!
答案 0 :(得分:2)
只是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列已更改为.
值。请参阅下面的操作
$ 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列保持不变。
答案 1 :(得分:1)
所以你要剥离毫秒,如果你的时间有类似的格式,试试这个
sed -E 's/(:[0-9]+)\.[0-9]+/\1/g'
答案 2 :(得分:1)
答案 3 :(得分:1)
在当前的正则表达式中,您精确指定了3位数字:
\{3\}
要在1到3位数字之间进行编写:
\{1,3\}
如果可能的话,使用sed仅在第8和第9列中替换非常困难。 但是,如果我们可以做出一些假设,那么解决方法可能对您有用:
在这种情况下,您可以删除/g
标志,并对每行输入应用替换两次,即:
sed -e cmd -e cmd
cmd是:
's/\(:[0-9][0-9]\)\.[0-9]\{1,3\}/\1/'
答案 4 :(得分:1)
这就是我想出的。它基本上使用7
跳过(\S+\s+){7}
列,然后修复以下2列:
sed -re 's/(\s*(\S+\s+){7})([^.]+)\.\S+([^.]+)\.\S+/\1\3\4/g'
答案 5 :(得分:0)
我有同样的问题 我用
解决了这个问题sed 's/\.[0-9]*//' source> destination