Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 转换csv中的时间戳列_Bash_Shell_Awk_Sed - Fatal编程技术网

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
如果我在一行中有两个时间戳,会怎么样?
-然后您可以编写代码来处理它们,不管您希望如何处理它们。如果您希望得到帮助,那么在给定输入的情况下,至少提供预期的输出。