我有一个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
答案 0 :(得分:0)
做出一些可能不切实际的假设,可以通过以下方式进行管理:
sed -e '/^value /!d' -e '/value/{N;N;s/\n/|/g;}' data
主要假设:
value c
转换为输出中的value C
。严格地说,第二个/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;}' "$@"
你将无法很容易地衡量那里的性能优势(它很小)。