Sed-根据第二行中的模式合并两行

Sed-根据第二行中的模式合并两行,sed,Sed,我正在处理手机的数据转储,需要重新格式化聊天文件 Person1 my son will be there shortly 5/3/2018 6:02:31 PM(UTC+0) Person2 OK. Tell him to call when he's here 5/3/2018 6:03:33 PM(UTC+0) Person1 Ok 5/3/2018 6:03:41 PM(UTC+0) Person2 You forgot your charger 5/3/2018 8:4

我正在处理手机的数据转储,需要重新格式化聊天文件

Person1   my son will be there shortly
5/3/2018 6:02:31 PM(UTC+0)
Person2   OK. Tell him to call when he's here
5/3/2018 6:03:33 PM(UTC+0)
Person1   Ok
5/3/2018 6:03:41 PM(UTC+0)
Person2   You forgot your charger
5/3/2018 8:43:20 PM(UTC+0)
我需要更改为(聊天和时间戳由一个选项卡分隔):

我一直在尝试将包含“UTC”的行与前一行合并,但到目前为止,我得到的最好结果是:

sed -e :a -e '$!N;s/\n.*UTC/\t/;ta' -e 'P;D' temp.txt > temp2.txt
结果如下:

Person1   my son will be there shortly   +0)
Person2   OK. Tell him to call when he's here   +0)
Person1   Ok   5/3/2018 +0)
Person2   You forgot your charger  +0)
我想使用“UTC”作为模式的原因是文件中还有其他非时间戳的无关行(例如多行聊天条目、附件信息等)。“UTC”是时间戳唯一的模式。

我会这样做:

$sed'N/\n、 *UTC/s/\n/\t/;PD’infle
人员1我儿子将于2018年5月3日下午6:02:31(UTC+0)抵达
好的。告诉他在这里时打电话2018年5月3日下午6:03:33(UTC+0)
Person1 Ok 2018年5月3日下午6:03:41(UTC+0)
人员2您忘记带充电器2018年5月3日下午8:43:20(UTC+0)
N;PD
创建一个移动的双线窗口;命令
/\n.*UTC/s/\n/\t/
说“如果模式空间第二行有
UTC
,请用一个选项卡替换换行符”。

我会这样做:

$sed'N/\n、 *UTC/s/\n/\t/;PD’infle
人员1我儿子将于2018年5月3日下午6:02:31(UTC+0)抵达
好的。告诉他在这里时打电话2018年5月3日下午6:03:33(UTC+0)
Person1 Ok 2018年5月3日下午6:03:41(UTC+0)
人员2您忘记带充电器2018年5月3日下午8:43:20(UTC+0)

N;PD
创建一个移动的双线窗口;命令
/\n.*UTC/s/\n/\t/
说“如果模式空间的第二行有
UTC
,请用一个选项卡替换换行符”。

如果您的示例代表一个规则结构的文件,并且只需将每隔一行与前一行合并,脚本就可以大大简化

我更喜欢Awk的易读性和可维护性:

awk 'NR%2 { printf "%s\t", $0; next } 1' file >newfile

更详细地说,NR是当前行号(或者更合适的记录号;默认情况下,Awk在换行符上拆分记录),
%
是数学模运算符。表达式在偶数行上的计算结果为非零(true),因此我们使用制表符而不是换行符打印这些行。
next
语句终止此输入行的脚本并获取下一行并重新开始,就像
sed
中的
n
命令一样。最后,对于到这里的每一行,单独的
1
都是正确的,这导致它被逐字打印。

如果您的示例代表一个规则结构的文件,并且您只需将每隔一行与前一行合并,脚本就可以大大简化

我更喜欢Awk的易读性和可维护性:

awk 'NR%2 { printf "%s\t", $0; next } 1' file >newfile

更详细地说,NR是当前行号(或者更合适的记录号;默认情况下,Awk在换行符上拆分记录),
%
是数学模运算符。表达式在偶数行上的计算结果为非零(true),因此我们使用制表符而不是换行符打印这些行。
next
语句终止此输入行的脚本并获取下一行并重新开始,就像
sed
中的
n
命令一样。最后,单独的
1
对于这里的每一行都是正确的,导致它被逐字打印。

所以您希望每个“UTC”行与前一行合并,是吗?是的,Beta。任何包含UTC的行都必须与前一行合并。因此,您希望每个“UTC”行与前一行合并,是吗?是的,Beta版。任何包含UTC的行都必须与前一行合并。谢谢。现在,我将回到文档中,以更好地了解这是如何工作的。(希望您能在tptb删除它之前看到它。)@alex_223如果您最近使用了GNU,您可以在调试模式(
--debug
)下运行,以查看到底发生了什么。我觉得很有启发性,谢谢。现在,我将回到文档中,以更好地了解这是如何工作的。(希望您能在tptb删除它之前看到它。)@alex_223如果您最近使用了GNU,您可以在调试模式(
--debug
)下运行,以查看到底发生了什么。我觉得这很有启发性。这对我来说是行不通的。正如我所指出的,并不是所有的文件都像我介绍的摘录一样,而且还有多行聊天条目,以及其他打破这种模式的行。不过还是要谢谢你,这对我来说是行不通的。正如我所指出的,并不是所有的文件都像我介绍的摘录一样,而且还有多行聊天条目,以及其他打破这种模式的行。不过还是要谢谢你。