0

以下是数据示例:

2013-06-22 00:00:49.307121|147374 |PHONE HOME|SDRKRKS|REAS|something|KRISTCOS 11:13 AM 6/22/2013
NUM: 90834098
data: 0394884
cX: 90h010f03040f
mR: 034050t0ds0
cNUM: 034050t0ds0
2013-06-22 00:00:49.307121|0950704421406        |PHONE HOME|SDRKRKS|REAS|something|MRS
2013-06-22 00:00:50.379487|0441813679603        |PHONE HOME|SDRKRKS|REAS|something|TN 90210

我需要一个脚本来从不以时间戳开头的行中删除换行符。在上面的示例中,第 2-5 行将附加到文本块中第一行的最后一个字段。我知道如何检测好的线条,

grep '^[0-9][0-9][0-9][0-9].*' testfile

还有坏线,

grep '^[^0-9][^0-9][^0-9][^0-9].*' testfile

现在的问题是,我如何应用它(使用 sed?)以便将“好”行后面的行放回该行的最后一个字段。在这里的任何帮助将不胜感激。

这是所需输出的示例:

2013-06-22 00:00:49.307121|147374 |PHONE HOME|SDRKRKS|REAS|something|KRISTCOS 11:13 AM 6/22/2013 NUM: 90834098 data: 0394884 cX: 90h010f03040f mR: 034050t0ds0 cNUM: 034050t0ds0
2013-06-22 00:00:49.307121|0950704421406 |PHONE HOME|SDRKRKS|REAS|something|MRS
2013-06-22 00:00:50.379487|0441813679603 |PHONE HOME|SDRKRKS|REAS|something|TN 90210

编辑:

对于哪个是最合适的工具存在一些分歧。目前我倾向于记事本++。这与我想做的事情很接近,但它不是很有效,也许有人可以帮我调整它以适应我的用例:

(?! [0-9]{4}\-[0-9]{2}-[0-9]{2}).*

(?! [0-9]{4}\-[0-9]{2}-[0-9]{2})  - searches for a line not like a timestamp
.*                                  - followed by anything else

问题是 .* 捕获了我试图否定的时间戳。有什么想法吗?

编辑2:感谢大家的有用建议,这绝对让我朝着正确的方向前进!以下正则表达式在 notepad++ 中找到有问题的 \n char,但是当我尝试执行替换时,没有任何反应:

Find: (.*)(\n)(?![0-9]{4}\-[0-9]{2}\-[0-9]{2})
Replace: \1

这里有没有人有关于如何强制 notepad++ 删除有问题的 \n 的任何想法?

编辑 3:这是似乎不适用于建议的解决方案的附加示例数据:

2013-06-22 00:00:02.540298|0238704723874        |SMELL TEST|HAKEKJ  |REAS|No cooking|tcna / ncc
2013-06-22 00:00:04.302887|3289749873342        |SMELL TEST|ICNIDF  |REAS|No cooking|JINUJ/CVGIND/NASR
6:13 AM 6/22/2013
VERIFIED CURLING
TN :- 834974978398
XX and YY updated
THIS IS A SENTENCE
2013-06-22 00:00:06.937545|30874987392838        |SMELL TEST|KCIDKD  |REAS|No cooking|SrutiD/cvgind/nasr
tn 4887839847
4

5 回答 5

2

使用您在一个文件中连接的所有已发布示例输入:

$ cat file
2013-06-22 00:00:49.307121|147374 |PHONE HOME|SDRKRKS|REAS|something|KRISTCOS 11:13 AM 6/22/2013
NUM: 90834098
data: 0394884
cX: 90h010f03040f
mR: 034050t0ds0
cNUM: 034050t0ds0
2013-06-22 00:00:49.307121|0950704421406        |PHONE HOME|SDRKRKS|REAS|something|MRS
2013-06-22 00:00:50.379487|0441813679603        |PHONE HOME|SDRKRKS|REAS|something|TN 90210
2013-06-22 00:00:02.540298|0238704723874        |SMELL TEST|HAKEKJ  |REAS|No cooking|tcna / ncc
2013-06-22 00:00:04.302887|3289749873342        |SMELL TEST|ICNIDF  |REAS|No cooking|JINUJ/CVGIND/NASR
6:13 AM 6/22/2013
VERIFIED CURLING
TN :- 834974978398
XX and YY updated
THIS IS A SENTENCE
2013-06-22 00:00:06.937545|30874987392838        |SMELL TEST|KCIDKD  |REAS|No cooking|SrutiD/cvgind/nasr
tn 4887839847

.

$ awk 'NR>1{pre = (/^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}/ ? ORS : OFS)} {printf "%s%s",pre,$0} END{print ""}' file
2013-06-22 00:00:49.307121|147374 |PHONE HOME|SDRKRKS|REAS|something|KRISTCOS 11:13 AM 6/22/2013 NUM: 90834098 data: 0394884 cX: 90h010f03040f mR: 034050t0ds0 cNUM: 034050t0ds0
2013-06-22 00:00:49.307121|0950704421406        |PHONE HOME|SDRKRKS|REAS|something|MRS
2013-06-22 00:00:50.379487|0441813679603        |PHONE HOME|SDRKRKS|REAS|something|TN 90210
2013-06-22 00:00:02.540298|0238704723874        |SMELL TEST|HAKEKJ  |REAS|No cooking|tcna / ncc
2013-06-22 00:00:04.302887|3289749873342        |SMELL TEST|ICNIDF  |REAS|No cooking|JINUJ/CVGIND/NASR 6:13 AM 6/22/2013 VERIFIED CURLING TN :- 834974978398 XX and YY updated THIS IS A SENTENCE
2013-06-22 00:00:06.937545|30874987392838        |SMELL TEST|KCIDKD  |REAS|No cooking|SrutiD/cvgind/nasr tn 4887839847

如果这不是您的预期输出,请更新您的问题以显示它是什么。

于 2014-05-15T02:43:19.273 回答
2

最简单的解决方案:

echo $(cat file) | sed -re 's/(2013-06)/@@@\1/g' | sed -re 's/@@@/\n/g'

这是有效的,因为没有引号的 echo 将所有内容放在同一行,然后我们在时间戳之前插入 @@@ 并将 @@@ 替换为换行符。

tiago@dell:~$ echo $(cat 文件) | sed -re 's/(2013-06)/@@@\1/g' | sed -re 's/@@@/\n/g'

2013-06-22 00:00:49.307121|147374 |电话首页|SDRKRKS|REAS|某事|KRISTCOS 2013 年 6 月 22 日上午 11:13 号码:90834098 数据:0394884 cX:90h010f03040f mR:034050t0ds cX:034050t0ds
2013-06-22 00:00:49.307121|0950704421406 |电话首页|SDRKRKS|REAS|东西|MRS
2013-06-22 00:00:50.379487|0441813679603 |电话首页|SDRKRKS|REAS|东西|TN 90210
2013-06-22 00:00:02.540298|0238704723874 |气味测试|HAKEKJ |REAS|没有烹饪|tcna / ncc
2013-06-22 00:00:04.302887|3289749873342 |气味测试|ICNIDF |REAS|没有烹饪|JINUJ/CVGIND/NASR 6:13 AM 6/22/2013 已验证的 CURLING TN :- 834974978398 XX 和 YY 更新了这是一个句子
2013-06-22 00:00:06.937545|30874987392838 |气味测试|KCIDKD |REAS|不做饭|SrutiD/cvgind/nasr tn 4887839847
tiago@dell:~$ 猫文件
2013-06-22 00:00:49.307121|147374 |电话首页|SDRKRKS|REAS|某事|KRISTCOS 2013 年 6 月 22 日上午 11:13
号码:90834098
资料:0394884
CX: 90h010f03040f
MR: 034050t0ds0
cNUM: 034050t0ds0
2013-06-22 00:00:49.307121|0950704421406 |电话首页|SDRKRKS|REAS|东西|MRS
2013-06-22 00:00:50.379487|0441813679603 |电话首页|SDRKRKS|REAS|东西|TN 90210
2013-06-22 00:00:02.540298|0238704723874 |气味测试|HAKEKJ |REAS|没有烹饪|tcna / ncc
2013-06-22 00:00:04.302887|3289749873342 |气味测试|ICNIDF |REAS|不烹饪|JINUJ/CVGIND/NASR
2013 年 6 月 22 日上午 6 点 13 分
经过验证的冰壶
TN :- 834974978398
XX 和 YY 更新
这是一个句子
2013-06-22 00:00:06.937545|30874987392838 |气味测试|KCIDKD |REAS|不做饭|SrutiD/cvgind/nasr
电话号码 4887839847
于 2014-05-15T10:34:44.933 回答
1

我不确定您喜欢做什么,因为您没有提供输出示例。
但是如果你喜欢连接线,你可以试试这个awk

awk '{printf (!/2013/?" ":RS)"%s",$0} END {print ""}'

2013-06-22 00:00:49.307121|147374 |PHONE HOME|SDRKRKS|REAS|something|KRISTCOS 11:13 AM 6/22/2013 NUM: 90834098 data: 0394884 cX: 90h010f03040f mR: 034050t0ds0 cNUM: 034050t0ds0
2013-06-22 00:00:49.307121|0950704421406        |PHONE HOME|SDRKRKS|REAS|something|MRS
2013-06-22 00:00:50.379487|0441813679603        |PHONE HOME|SDRKRKS|REAS|something|TN 90210
于 2014-05-14T16:48:16.197 回答
1

这可能对您有用(GNU sed):

sed ':a;$!N;/^[^|]*$/Ms/\n/ /;ta' file

如果附加的最后一行不包含 a|用空格替换换行符并重复。

于 2014-05-14T19:48:31.573 回答
1

这是使用 GNU 的一种方法sed

sed -nr ':a;N;/\n[0-9]{4}-[0-9]{2}-[0-9]{2}/{P;$!D;s/.*\n//p};s/\n/ /g;$!ba;p' file

解释:

  • 创建标签:a
  • 使用将下一行附加到模式空间上的当前行N
  • /\n[0-9]{4}-[0-9]{2}-[0-9]{2}/{P;$!D;s/.*\n//p} 测试附加的行是否以日期开头,如果是,则打印到第一个换行符,如果它不是最后一行,则删除到第一个新行。如果它是最后一行,则删除到换行符并打印它。
  • s/\n/ /g;对于所有其他行,请继续删除新行。
  • ba分支回到我们的标签并重复
于 2014-05-14T17:04:49.577 回答