【问题标题】:unix merging character and next line to one lineunix将字符和下一行合并到一行
【发布时间】:2017-05-30 08:55:25
【问题描述】:

$ cat TPSCIS1705291200.err

0301705293504895     000003330011868452100001742N
#ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N
#ERROR - Can not find Account:12404797-010

这里我希望将最后一个字符 N 和下一行字符 # 替换为一行

预期的输出应该类似于

0301705293504895     000003330011868452100001742N,#ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N,#ERROR - Can not find Account:12404797-010

请帮忙,因为字符 N 和 # 在不同的行中,所以我无法找到最好的方法

【问题讨论】:

  • 请重新格式化块 - 不清楚输入是什么以及您要生成什么

标签: unix sed


【解决方案1】:

sed 不会匹配换行符。一个可能的技巧是首先将它们“翻译”为其他字符,然后执行sed-subtitution。

在这段代码中,我使用tr 命令将换行符替换为不同的“回车”字符(`\f'),然后用 sed 替换它,最后将这些新行替换回去

cat myfile | tr '\n' '\f' | sed -e "s/N$(echo '\f')/N,#/g" | tr '\f' '\n'

上面的另一个肮脏的技巧是对echo '\f\ 进行命令替换,因为它也不能成为正则表达式的一部分!

工作代码(在 bash 中用于 MacOS):

-- /tmp » cat in
0301705293504895 000003330011868452100001742N
ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N
ERROR - Can not find Account:12404797-010
--- /tmp » cat in| tr '\n' '\f' | sed -e "s/N$(echo '\f')/N,#/g" | tr '\f' '\n'
0301705293504895 000003330011868452100001742N,#ERROR - Can not find Account:3504895
04117052912404797-010000005947011868455100001410N,#ERROR - Can not find Account:12404797-010

【讨论】:

  • 感谢 Herchu 我在 unix os 中尝试过,但没有给我想要的操作
  • 16:19:42 [mau-bss-app:/opt/redknee/dist/TEST_export_TPS]$ uname -a SunOS mau-bss-app 5.10 Generic_150401-13 i86pc i386 i86pc
【解决方案2】:

看来您只是想合并所有其他行:

awk 'NR%2 { printf "%s,", $0; next} 1' input

【讨论】:

  • 这很有趣。我已经开始更改ORS-F。但是你的东西似乎很适合这样简单的输入数据
  • 不,我需要将第一行的最后一个字符 N 和以 # 开头的第二行合并在一起
  • @SonnySanphil,所以在开始时尝试一下,您会看到它已按预期合并
【解决方案3】:

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

sed -i ':a;/N$/N;s/\n#/,#/;ta;P;D' file

如果当前行以N 结尾并且下一行以# 开头,则将换行符替换为, 并重复。否则打印第一行并重复。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多