Bash 转换csv中的时间戳列
我有一个标签。这些行如下所示:Bash 转换csv中的时间戳列,bash,shell,awk,sed,Bash,Shell,Awk,Sed,我有一个标签。这些行如下所示: 57760234 some@email.com 3791 text_value 2016-04-25 07:56:59+02 2 57767500 some@email.com 3784 text_value 2016-04-25 07:30:49+02 2 如何从所有行的timestamp列中删除+02(我假设它可以是任何数字,而不仅仅是+02)位 另外,如果我在一行中有两个时间戳呢?像 57760234 some@e
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59+02 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49+02 2
如何从所有行的timestamp列中删除+02(我假设它可以是任何数字,而不仅仅是+02)位
另外,如果我在一行中有两个时间戳呢?像
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59+02 2016-04-25 07:56:59+02 2
试试这一行,我没有测试,但应该可以
awk 'BEGIN{FS=OFS="\t"}{sub(/[+][0-9]+$/,"",$(NF-1))}7' file
试试这一行,我没有测试,但应该可以
awk 'BEGIN{FS=OFS="\t"}{sub(/[+][0-9]+$/,"",$(NF-1))}7' file
试试这个:
sed -i 's|+[0-9]\+\([[:space:]]\+[0-9]\+\)$|\1|' file
在这里,我使用regexp将行末尾的+022
替换为2
重要提示:它适用于加号之后的任何数字,但有这个加号很重要,没有它就不起作用
更新:
另外,如果我在一行中有两个时间戳呢?像
在这种情况下,它将不起作用,您可以使用另一种方法,即使用时间戳替换日期,而不使用时间戳:
sed -i 's|\([0-9]\+:[0-9]\+:[0-9]\+\)+[0-9]\+|\1|g' file
但是日期的格式应该是07:56:59+02
试试这个:
sed -i 's|+[0-9]\+\([[:space:]]\+[0-9]\+\)$|\1|' file
在这里,我使用regexp将行末尾的+022
替换为2
重要提示:它适用于加号之后的任何数字,但有这个加号很重要,没有它就不起作用
更新:
另外,如果我在一行中有两个时间戳呢?像
在这种情况下,它将不起作用,您可以使用另一种方法,即使用时间戳替换日期,而不使用时间戳:
sed -i 's|\([0-9]\+:[0-9]\+:[0-9]\+\)+[0-9]\+|\1|g' file
但是日期的格式应该类似于
07:56:59+02
,因为+
后面跟一个数字不会出现在任何其他字段(列)中,我们不必担心影响哪个字段:
$ cat file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59+02 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49+02 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59+02 2016-04-25 07:56:59+02 2
$
$ sed 's/+[0-9]*//' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59+02 2
$
$ sed 's/+[0-9]*//g' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59 2
$
$ awk '{sub(/+[0-9]*/,"")}1' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59+02 2
$
$ awk '{gsub(/+[0-9]*/,"")}1' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59 2
如果这不是您需要的,则编辑您的问题,以包括一些更具代表性的示例输入和预期输出。因为在任何其他字段(列)中都不会出现后跟数字的
+
,所以我们不必担心影响哪个字段:
$ cat file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59+02 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49+02 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59+02 2016-04-25 07:56:59+02 2
$
$ sed 's/+[0-9]*//' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59+02 2
$
$ sed 's/+[0-9]*//g' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59 2
$
$ awk '{sub(/+[0-9]*/,"")}1' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59+02 2
$
$ awk '{gsub(/+[0-9]*/,"")}1' file
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2
57767500 some@email.com 3784 text_value 2016-04-25 07:30:49 2
57760234 some@email.com 3791 text_value 2016-04-25 07:56:59 2016-04-25 07:56:59 2
如果这不是您需要的,那么请编辑您的问题,以包含一些更具代表性的示例输入和预期输出。I想完全删除它:)是的,这将删除它,但我们需要保留最后一列,对吗?如果一行中有2个或更多的时间戳呢?呜呜呜!谢谢大家!@丹尼斯,不客气。如果有帮助的话,别忘了接受我的回答;)我想完全摆脱它:)是的,这将删除它,但我们需要保留最后一列,对吗?如果我们在一行中有2个或更多的时间戳呢!谢谢大家!@丹尼斯,不客气。如果有帮助的话,别忘了接受我的回答;)谢谢你,肯特。对我来说很好。你能看一下这个小更新吗,从一开始就没有考虑所有的情况--@Dennis如果
+02
可以在某些列或任何列的末尾,那就不同了。要求是什么?是否从所有列中删除任何+02
后缀?或者只在x和y列中删除?这是第2列。+2只能在特定列的末尾。@Dennis然后只执行awk'BEGIN{FS=OFS=“\t”;re=“[+][0-9]+$”}{sub(re,”,$(NF-1));sub(re,“,$(NF-2))}7'文件
它应该对最后两列hanks Kent应用删除操作。对我来说很好。你能看一下这个小更新吗,从一开始就没有考虑所有的情况--@Dennis如果+02
可以在某些列或任何列的末尾,那就不同了。要求是什么?是否从所有列中删除任何+02
后缀?或者只在x和y列中删除?这是第2列。+2只能在特定列的末尾。@Dennis然后只做awk'BEGIN{FS=OFS=“\t”;re=“[+][0-9]+$”}{sub(re,”,$(NF-1));sub(re,“,$(NF-2))}7'文件
它应该对最后两列应用删除操作,这不是UTC偏移量吗?它似乎是时间戳中相当重要的一部分。是的,这是UTC偏移量。然而,在当前的逻辑中,它们只是去掉了它,所以我认为我应该按照流程去做。wrt如果我在一行中有两个时间戳,会怎么样?
-然后您可以编写代码来处理它们,不管您希望如何处理它们。如果您希望得到帮助,那么至少提供给定输入的预期输出。这不是UTC偏移量吗?它似乎是时间戳中相当重要的一部分。是的,这是UTC偏移量。然而,在当前的逻辑中,它们只是去掉了它,所以我认为我应该按照流程去做。wrt如果我在一行中有两个时间戳,会怎么样?
-然后您可以编写代码来处理它们,不管您希望如何处理它们。如果您希望得到帮助,那么在给定输入的情况下,至少提供预期的输出。