alterando a ordem dos itens em uma lista

4

Eu tenho um arquivo com texto simples. Este arquivo contém uma lista como esta:

@"Joe", @"211",
@"Bob Nelson", @"132",
@"Jack Sierra", @"3422",
@"Walt Robert", @"14",

A lista continua com milhares de nomes ... Preciso mudar a ordem dos elementos e transformar essa lista em

@"211", @"Joe",
@"132", @"Bob Nelson",
@"3422", @"Jack Sierra",
@"14", @"Walt Robert",

Como faço isso a partir do terminal?

    
por SpaceDog 11.01.2012 / 22:58

2 respostas

3

Este vai trabalhar com strings com espaços:

sed 's/\(@"[^"]*"\), \(@"[^"]*"\)/, /' input.txt

Como funciona:

sed - (s) tream (ed) itor executará o (s) comando ubstosute em cada linha de entrada,
e substitui \(@"[^"]*"\), \(@"[^"]*"\) pelo , .

A significa a segunda correspondência (das segundas chaves)
O significa a primeira correspondência (das primeiras chaves).

As chaves devem ter escape, por isso temos \( e \) . Dentro, procuramos por @ character, em seguida, " character e, em seguida, [^"] , quaisquer caracteres diferentes de " repetidos a qualquer momento e, em seguida, o caractere " .

Em seguida, esperamos , comma seguido do espaço e do segundo grupo semelhante para o .

    
por 11.01.2012 / 23:31
1

Corresponda o primeiro campo, o separador e o segundo campo e imprima-os na ordem inversa. Assumindo que não pode haver vírgulas dentro das aspas duplas:

sed -e 's/\(.*,\)\( \)\(.*,\)//'

Awk é mais desajeitado aqui por causa da vírgula no final da linha. No entanto, você pode fazer a troca tratando vírgula mais espaço ou / +/ como o separador de campo.

awk -F ', ' '{print $2 " " $1 ","}'

Se houver vírgulas dentro das aspas, você precisará combinar os campos de uma maneira que leve em consideração as regras de escape da sua cotação (se houver).

    
por 11.01.2012 / 23:34