Unix Shell Script获取文件中的所有特定字符串并垂直修改它

时间:2013-09-13 05:58:15

标签: shell unix

我有一个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

1 个答案:

答案 0 :(得分:0)

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

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

主要假设:

  1. 当你得到一个'value'行时,会跟着两个'value'行(在一组三个'value'行的中间没有'row'行)。
  2. 无需将输入中的value c转换为输出中的value C
  3. 在'价值'和空格之后出现的内容无关紧要(所以任何字母或单词 - 实际上,任何文字都可以在'价值'之后出现)。
  4. 严格地说,第二个/value/参数中的-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;}' "$@"
    

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