-4

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

1 回答 1

0

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

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

主要假设:

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

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


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

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

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

可选前缀sedwith exec,如:

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

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

于 2013-09-13T06:16:51.410 回答