经过长时间的搜索,我无法找到解决方案。有人可以帮忙解决这个问题,谢谢。
开始模式[某些数字],结束模式接下来[某些数字]。
输入:
[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
答案 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文件中。