AWK - 移动区域(修正版)

时间:2013-11-06 10:55:31

标签: awk

我有一个文件:

A B C D E
jeden dwa- trzy cztery piec
czarny) bialy zielony niebieski siwy
czarny) bialy zielony niebieski siwy
kot pies mysz osa byk
jeblon grusza czeresnia- sliwa orzech
tulipan narcyz filolek) irys bez
sliwka jabkko pomarancza kiwi arbuz
5 A B C D E
sliwka jabkko pomarancza kiwi arbuz-
marek ewa ela tomek) romek

我试过了:

awk 'c-->0;/- /{c=1; print}' file

如何改进这个例子,获得这样的结果? 我想得到这个结果:

A B C D E
jeden dwa-czarny) trzy cztery piec
 bialy zielony niebieski siwy
czarny) bialy zielony niebieski siwy
kot pies mysz osa byk
jeblon grusza czeresnia-filolek) sliwa orzech
tulipan narcyz  irys bez
sliwka jabkko pomarancza kiwi arbuz
5 A B C D E
sliwka jabkko pomarancza kiwi arbuz-tomek)
marek ewa ela  romek

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

感谢@ fedorqui的“解密”,我认为玩RS可以让问题更容易解决。我想出了这个单行:(它与我的傻瓜合作)

awk -v RS='\\S+\\)' -v ORS="" '{$0=sub(/-/,"-"RT)?$0:$0RT}7' file

试验:

kent$  cat f
A B C D E
jeden dwa- trzy cztery piec
czarny) bialy zielony niebieski siwy
czarny) bialy zielony niebieski siwy
kot pies mysz osa byk
jeblon grusza czeresnia- sliwa orzech
tulipan narcyz filolek) irys bez
sliwka jabkko pomarancza kiwi arbuz
5 A B C D E
sliwka jabkko pomarancza kiwi arbuz-
marek ewa ela tomek) romek

kent$  awk -v RS='\\S+\\)' -v ORS="" '{$0=sub(/-/,"-"RT)?$0:$0RT}7' f
A B C D E
jeden dwa-czarny) trzy cztery piec
 bialy zielony niebieski siwy
czarny) bialy zielony niebieski siwy
kot pies mysz osa byk
jeblon grusza czeresnia-filolek) sliwa orzech
tulipan narcyz  irys bez
sliwka jabkko pomarancza kiwi arbuz
5 A B C D E
sliwka jabkko pomarancza kiwi arbuz-tomek)
marek ewa ela  romek

答案 1 :(得分:4)

我想我已经理解了逻辑 如果一行中包含-,请从下一行中获取包含)的字段。
然后删除该行的字段。

awk  '
    /-/ {
        a=$0
        getline
        for (i=1;i<=NF;i++) if ($i~")") 
            t=i
        sub(/-/,"-"$t,a)
        $t=""
        print a "\n" $0
        next
    }
    !/-/' file

A B C D E
jeden dwa-czarny) trzy cztery piec
 bialy zielony niebieski siwy
czarny) bialy zielony niebieski siwy
kot pies mysz osa byk
jeblon grusza czeresnia-filolek) sliwa orzech
tulipan narcyz  irys bez
sliwka jabkko pomarancza kiwi arbuz
5 A B C D E
sliwka jabkko pomarancza kiwi arbuz-tomek)
marek ewa ela  romek

对于那些喜欢一个衬垫的人:

awk '/-/ {a=$0;getline;for (i=1;i<=NF;i++) if ($i~")")t=i;sub(/-/,"-"$t,a);$t="";print a "\n" $0;next} !/-/' file

通过使用split来查找单词并且没有循环来缩短它:

awk  -F")" '
    /-/ {
        a=$0
        getline
        t=split($1,x," ")
        sub(/-/,"-"x[t]")",a)
        $t=""
        print a "\n" $0
        next
    }
    !/-/
    ' file

awk  -F")" '/-/ {a=$0;getline;t=split($1,x," ");sub(/-/,"-"x[t]")",a);$t="";print a"\n"$0;next} !/-/' file