拆分文件内容并按顺序排列

时间:2015-10-21 12:00:01

标签: bash awk sed grep cut

我有一个这样的文件:

{A{AAA} B{BBB} test {CCC CCC
}}
{E{EEE} F{FFF} test {GGG GGG
}}
{H{HHH} I{III} test {JJJ -JJJ
}}
{K{KKK} L{LLL} test {MMM 
}}

更新

我想使用linux命令以获得以下输出:

AAA:BBB:CCC CCC
EEE:FFF:GGG GGG
HHH:III:JJJ -JJJ
KKK:LLL:MMM

3 个答案:

答案 0 :(得分:3)

使用gnu-awk你可以这样做:

awk -v RS='}}' -v FPAT='{[^{}]+(}|\n)' -v OFS=':' '{for (i=1; i<=NF; i++) {
              gsub(/[{}]|\n/, "", $i); printf "%s%s", $i, (i<NF)?OFS:ORS}}' file
AAA:BBB:CCC CCC
EEE:FFF:GGG GGG
HHH:III:JJJ -JJJ
KKK:LLL:MMM
  • -v RS='}}'将使用}}文字
  • 打破每条记录
  • -v FPAT='{[^{}]+(}|\n)'将使用给定的正则表达式分割字段。正则表达式匹配以{开头的每个字段,并匹配除{ and }后跟}或换行符之外的任何字段。
  • -v OFS=':'将输出字段分隔符设置为:
  • gsub(/[{}]|\n/, "", $i)从每个字段中删除{}或换行符

更短的命令(感谢JoseRicardo):

awk -v RS='}}' -v FPAT='{[^{}]+(}|\n)' -v OFS=':' '{$1=$1} gsub(/[{}]|\n/, "")' file

甚至是这样:

awk -v FPAT='{[^{}]{2,}' -v OFS=':' '{$1=$1} gsub(/[{}]/, "")' file

答案 1 :(得分:1)

Perl解决方案

perl -nwe 'print join ":", /{([^{}]{2,})/g' file

正则表达式在curlie之后提取2个或更多个非curlies的组,然后用冒号分开打印。

答案 2 :(得分:1)

这种特定格式

sed -n 's/...//;s/}[^{]*//g;s/{/:/gp' YourFile