【问题标题】:Unix Shell Script get all specific string on a file and modify it verticallyUnix Shell 脚本获取文件上的所有特定字符串并垂直修改它
【发布时间】:2013-09-13 05:58:15
【问题描述】:

我有一个包含字符串的 TEXT 文件

例如logs.txt:

value1 A
value2 B
value3 c
row
row
row
value1 A
value2 D
value3 c
row
value1 E
value2 B
value3 A
row
row
value1 Z
value2 B
value3 E

我想要的只是用“|”垂直获取所有值A,值B,值C管道分隔符

输出:

value1 A|value2 B|value3 C
value1 A|value2 D|value3 C
value1 E|value2 B|value3 A
value1 Z|value2 B|value3 E

【问题讨论】:

  • 您可以使用所有 awk 脚本之母来执行此操作,但它确实需要的不仅仅是 shell 脚本。请提供一些更好的示例数据。 “行”有什么意义?
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。应该使用什么模式来检测“价值”线?是“价值”吗?如果也有“值 D”行会怎样?你能在“价值”行之间得到“行”行吗?如果只有两条“价值”线会发生什么?是否有必要将输入中的“c”大小写转换为输出中的“C”?是否“每三个值行输出一个新行”?
  • 嗨 Jonahtan,是的,可能有“值 D”,但关键字是“值”,我的场景总是有 3 个关键字“值”在序列中

标签: shell unix


【解决方案1】:

做出一些可能不切实际的假设,这可以通过以下方式进行管理:

sed -e '/^value /!d' -e '/value/{N;N;s/\n/|/g;}' data

主要假设:

  1. 当您得到一个“值”行时,后面跟着两个“值”行(在一组三个“值”行的中间没有“行”行)。
  2. 无需将输入中的value c 大小写转换为输出中的value C
  3. “值”和空格之后出现的内容并不重要(因此任何字母或单词——实际上,任何文本——都可以在“值”之后出现)。

严格来说,第二个-e 参数中的/value/ 不是必需的,但它强调它只处理“值”行。


要将其制作成脚本,请使用:

#!/bin/sh
sed -e '/^value /!d' -e '/value/{N;N;s/\n/|/g;}' "$@"

"$@" 表示“传递给脚本的所有参数”,预计将是一组要处理的文件名(如果他们愿意,没有什么可以阻止有创造力的用户传递更多 sed 命令 -虽然如果他们尝试,它可能不会对他们有多大好处)。输出进入标准输出,因此您可以通过 I/O 重定向或管道捕获它。

可选择在sed 前加上exec,如:

#!/bin/sh
exec sed -e '/^value /!d' -e '/value/{N;N;s/\n/|/g;}' "$@"

您将无法很容易地衡量那里的性能优势(它很小)。

【讨论】:

  • 嗨乔纳森,是的,在一组三个“值”行的中间不会有行行
  • 如何使用此代码“sed -e '/^value /!d' -e '/value/{N;N;s/\n/|/g;}' 数据”
  • #! /bin/bash sed -e '/^value /!d' -e '/value/{N;N;s/\n/|/g;}' 数据(像这样?)
  • 请给我更多关于如何解决这种情况的想法。我想制作一个将在“PuTTy”上运行的“.sh”文件
  • 请参考例子的变化...非常感谢
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多