bash将文本块(多行)转换为单行

时间:2017-07-21 13:34:13

标签: bash

经过长时间的搜索,我无法找到解决方案。有人可以帮忙解决这个问题,谢谢。

开始模式[某些数字],结束模式接下来[某些数字]。

输入:

[2450]
some text
keyword1=abc
some text
some text
keyword2=def

[112]
some text
keyword1=abc
keyword2=def
some text
some text

[223]
some text
keyword1=abc
some text
keyword2=def
some text

输出:

第一列:括号内的数字

第二栏:来自keyword1的文字

第三栏:来自keyword2的文字

2450;abc;def
112;abc;def
223;abc;def

3 个答案:

答案 0 :(得分:0)

awk -F[ '{ if ($0 ~ /\[[[:digit:]]+\]/) { split($2,arry,"]");numba=arry[1] } else if ($0 ~ /keyword/) { bit=split($0,key,"=");dat[numba]=dat[numba]key[2]";" } } END { for(i in dat) { print i";"dat[i] } }' filename

使用awk,使用" ["作为字段分隔符。如果线条图案与[数字]匹配,则仅使用分割提取数字并使用此数字作为数组的索引(dat)然后将每条线条添加到数组数据中,最后循环并打印前缀为索引。此解决方案的唯一问题是订购。我不确定这是否重要。

答案 1 :(得分:0)

<强>输入

$ cat file
[2450]
some text
keyword1=abc
some text
some text
keyword2=def

[112]
some text
keyword1=abc
keyword2=def
some text
some text

[223]
some text
keyword1=abc
some text
keyword2=def
some text

输出

$ awk -F= -v OFS=';' 'function p(){ if(n && k)print n,k; n=k="" }/^\[/{gsub(/[^0-9]+/,""); n=$0}/keyword/{k=(k ? k OFS:"")$2}!NF{p()}END{p()}' file
2450;abc;def
112;abc;def
223;abc;def

更好的可读版本

awk -F= -v OFS=';' '
      function p(){ 
          if(n && k) 
              print n,k; 
              n=k="" 
      }
      /^\[/{
               gsub(/[^0-9]+/,""); 
               n=$0
      }
      /keyword/{
               k=(k ? k OFS:"")$2
      }
      !NF{
              p()
       }
       END{
               p()
       }
       ' file

答案 2 :(得分:0)

你可以使用:

cat test.txt | head -c -1 | sed '/^\s*$/d' | tr '\n' ';' | sed 's/\;\[/\n\[/g' >> test2.txt

在本例中,该命令读取文件text.txt删除最后一个字节,替换所有空行,将所有换行符替换为:“;”并替换所有出现的:“; [”用换行符:“[”。最后,结果写在test2.txt文件中。