从特定列

时间:2016-05-13 12:25:02

标签: 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命令,以便删除我删除了3毫秒的文件上的两毫秒。像这样:

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

这样可以正常工作,因为我发现它从那时起消除了两毫秒。

问题:

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

问题

如何使用一个命令处理所有三种情况。当我说三种情况时,我指的是有两毫秒,一毫秒和三毫秒。另外,如何确保修改第8列和第9列。

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

6 个答案:

答案 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)

根据您的sed版本,您可以使用:

sed -E 's/\.\d{1,3}//g'

sed -E 's/\.[0-9]{1,3}//g'

Bash Demo

答案 3 :(得分:1)

在当前的正则表达式中,您精确指定了3位数字:

\{3\}

要在1到3位数字之间进行编写:

\{1,3\}

如果可能的话,使用sed仅在第8和第9列中替换非常困难。 但是,如果我们可以做出一些假设,那么解决方法可能对您有用:

  • 8日之前的列将永远不会匹配
  • 第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