1

I have a file:

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

I have tried:

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

How to improve this example, to obtain such a result? I want to get this result:

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

Thank you for your help.

4

2 回答 2

6

thanks @fedorqui's "decryption", I think that playing RS could make the problem easier to be solved. I come up with this one-liner: (it worked with my gawk)

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

test:

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
于 2013-11-06T11:40:14.423 回答
4

I think I have understand the logic.
If a line has a - in it, get the field from next line that has a ) in it.
Then remove the field form that line.

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

And for those who like one liners:

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

Shorten it some by using split to find the word and no loop:

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
于 2013-11-06T11:16:03.077 回答