http://www.zago.eti.br/script/colunas.txt FAQ com mensagens sobre tratamento de colunas Use CTRL+F para refinar a pesquisa. Linha de: **************** separa mensagens ou tópicos. ******************************************************** Zago http://www.zago.eti.br/menu.html FAQ e artigos sobre Linux ******************************************************** ******************************************************** De: Thiago Macieira Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)inverter a ordem das colunas em um arquivo Data: Tue, 15 Mar 2005 22:57:15 -0300 Rodrigo Monteiro wrote: >tenho um arquivo que na primeira coluna tem o orgao e >na segunda tem o total de usuarios desse orgao, essas >colunas sao TABuladas, sao provenientes de grep, ls, >cat e outros comandos concatenados. >eu queria inverter a ordem dessas colunas para gerar >outro arquivo. alguem tem ideia de como eu faco? Hmm, tem mais opções. Outra opção é o sed: sed -i 's/^\([^ ]*\) \([^ ]*\)/\2 \1/' arquivo Ou perl: perl -pi -e 's/^([^ ]*) ([^ ]*)/\2 \1/' arquivo perl -ni -e 'split / /; print $2, $1' arquivo Ou o awk: awk '{ print $2, $1}' arquivo -- Thiago Macieira - thiago (AT) macieira (DOT) info PGP/GPG: 0x6EF45358; fingerprint: E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358 5. Swa he géanhwearf tó timbran, and hwonne he cóm, lá! Unix cwæð "Hello, World". ?fre ?ghwilc wæs glæd and seo woruld wæs fréo. ******************************************************** De: Thiago Macieira Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)inverter a ordem das colunas em um arquivo Data: Tue, 15 Mar 2005 22:54:30 -0300 Rodrigo Monteiro wrote: >tenho um arquivo que na primeira coluna tem o orgao e >na segunda tem o total de usuarios desse orgao, essas >colunas sao TABuladas, sao provenientes de grep, ls, >cat e outros comandos concatenados. >eu queria inverter a ordem dessas colunas para gerar >outro arquivo. alguem tem ideia de como eu faco? Use o cut e o paste. cut -f 1 < arquivo > coluna1 cut -f 2 < arquivo > coluna2 paste coluna2 coluna1 > arquivo -- Thiago Macieira - thiago (AT) macieira (DOT) info ******************************************************** De: Flavio do Carmo Junior Para: Rodrigo Monteiro , linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)inverter a ordem das colunas em um arquivo Data: Wed, 16 Mar 2005 10:11:15 -0200 Cara.. Foi bastante interessante seu e-mail, eu TIVE que aprender o tal do awk, e já gostei :) Eu nunca tinha precisado dele pra resolver problemas assim, por isso não conhecia nada, lendo 1 HP sobre o tal, resolvi seu problema assim: cria um arquivo "x.awk" com conteudo: $ cat x.awk { OFS=" "; print $2"\t"$1; } e executa: $ awk -F" " -f x.awk SEUARQUIVO.txt Aqui deu tudo certo, agora vou aprender usar o awk na linha de comando, sem o -f :D drkn Sem mais, Flavio do Carmo Junior Depto. de Informática Roberto Cervellini & Cia Ltda. (18) 2101 - 1111 ---------- Original Message ----------- From: Rodrigo Monteiro To: linux-br@bazar2.conectiva.com.br Sent: Tue, 15 Mar 2005 04:21:37 -0800 (PST) Subject: (linux-br)inverter a ordem das colunas em um arquivo > tenho um arquivo que na primeira coluna tem o orgao e > na segunda tem o total de usuarios desse orgao, essas > colunas sao TABuladas, sao provenientes de grep, ls, > cat e outros comandos concatenados. > eu queria inverter a ordem dessas colunas para gerar > outro arquivo. alguem tem ideia de como eu faco? > De: Thiago Macieira Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)inverter a ordem das colunas em um arquivo Data: Wed, 16 Mar 2005 11:20:59 -0300 Flavio do Carmo Junior wrote: >$ cat x.awk >{ > OFS=" "; > print $2"\t"$1; >} > >e executa: >$ awk -F" " -f x.awk SEUARQUIVO.txt > >Aqui deu tudo certo, agora vou aprender usar o awk na linha de comando, > sem o -f :D awk -F" " '{ print $2, $1 }' Como não uso o \f, não precisa mexer no OFS. E o IFS padrão já é o espaço, então -F" " é desnecessário. -- Thiago Macieira - thiago (AT) macieira (DOT) info PGP/GPG: 0x6EF45358; fingerprint: E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358 1. On frumscafte, hwonne time_t wæs náht, se scieppend þone circolwyrde wundorcræftlíge cennede and seo eorðe wæs idel and hit wæs gód. ******************************************************** De: Claudio Polegato Jr. Para: Rodrigo Monteiro Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)inverter a ordem das colunas em um arquivo Data: Wed, 16 Mar 2005 06:18:44 +0000 Olá, Fazendo alguns testes, encontrei alguns errinhos e consertei. Segue a versão 0.2 no corpo da mensagem. Deve-se consertar as linhas que foram quebradas para se compilar. []'s Claudio /************************************************************ * Programa: colunador.c * * Autor: Claudio Polegato Junior * * Data Inicial: 14/08/2001 * * Atualização: 16/03/2005 * * Versão: 0.2 * * * * Copyright (C) 2001 por Claudio Polegato Junior * * Todos os direitos reservados * ************************************************************/ /************************************************************ * Descrição * * * * Programa para trabalhar com as colunas de um arquivo * * texto utilizando-se de colunas com vários delimitadores * * e envolvedores de texto na coluna. Cada delimitador * * separa uma coluna da outra e cada linha da entrada deve * * terminar por \n (nova linha). * * Este programa requer uma arquivo de entrada (onde - * * especifica stdin, que é a entrada padrão) e um arquivo * * de saída (onde - especifica stdout, que é a saída * * padrão). Seguido destes parâmetros obrigatórios, tem-se * * os opcionais que são cada coluna a ser colocada na saída * * do programa. Caso não seja fornecidad nenhuma coluna, * * inverte a ordem de todas as colunas encontradas na * * linha. * * Os envolvedores de texto são validados quando o * * primeiro caracter de uma coluna inicia por ele e o texto * * desta coluna vai até encontrar o caracter correspondente * * ao envolvedor final, notado que cada envolvedor inicial * * tem um envolvedor final não necessariamente igual ao * * inicial. O texto depois do envolvedor final é ignorado e * * o este texto engloba qualquer caracter que não seja o * * envolvedor final, inclusive o caracter de nova linha e * * separadores de coluna. * * Existem algumas personalizações (até estou pensando * * em colocar um arquivo de configuração, por exemplo) que * * podem ser feitas alterando as constantes abaixo. Está * * bem explicado o significado de cada uma e pode ser usada * * a critério das necessidades do momento. * ************************************************************/ // Defina aqui o separador de colunas na saída // Para manter o mesmo da entrada, deixe-o com '\0' const char Separador_Saida = '\0'; // Defina aqui o envolvedor de texto da coluna na saída (inicial e final) // Para manter os mesmos da entrada use '\0' e para desaparecer com eles use '\b' const char Envolvedor_Saida = '"'; const char Envolvedor_Fim_Saida = '"'; // Mude para diferente de zero se quizer todos os textos de cada coluna envolvido pelos envolvedores de texto acima const int Envolver_Todos = 0; // Caracteres delimitadores de Coluna // O espaço (' ') é interessante para arquivos com colunas que não contenham espaços // ou cada uma sempre entre aspas const char Delimitadores[] = {',', ';', '\t'}; // , ' '}; // Caracteres que envolvem um texto completo const char Envolvedores[] = {'"', '\'', '(', '[', '{', '<'}; const char Envolvedores_Fim[] = {'"', '\'', ')', ']', '}', '>'}; #include #include #include #include #include int Nao_Delimitador(char c){ int i = 0; while (c != Delimitadores[i] && ++i < sizeof(Delimitadores)); return (i == sizeof(Delimitadores)); } int Envolvedor(char c){ int i = 0; while (c != Envolvedores[i] && ++i < sizeof(Envolvedores)); if (i == sizeof(Envolvedores)) i = -1; return i; } int main(int argc, char* argv[]){ FILE *Original, *Saida; int Tamanho, Env, Indice_Coluna; char *Conteudo, *c, *Coluna[1024]; char Separador[1024]; // Define localização setlocale(LC_ALL, ""); // Se não dados pelo menos o nome do arquivo original e o de saída, sai mostrando a forma de uso if (argc < 3){ fprintf(stderr, "\nUso: %s [1ª Coluna [2ª Coluna [...]]]", *argv); fprintf(stderr, "\n Caso não seja informada a ordem das colunas, inverte a ordem.\n\n"); return -1; } // Abre o arquivo original e retorna o erro se não conseguir if (strcmp(argv[1], "-")){ Original = fopen(argv[1], "r"); if (! Original){ fprintf(stderr, "\nNão foi possível ler %s: %s\n\n", argv[1], strerror(errno)); return errno; } } else Original = stdin; // Abre e zera ou cria o arquivo de saída e retorna o erro se não conseguir if (strcmp(argv[2], "-")){ Saida = fopen(argv[2], "w"); if (! Saida){ fclose(Original); fprintf(stderr, "\nNão é possível gravar em %s: %s\n\n", argv[1], strerror(errno)); return errno; } } else Saida = stdout; // Tamanho do arquivo original fseek(Original, 0, SEEK_END); Tamanho = ftell(Original); fseek(Original, 0, SEEK_SET); // Coloca o conteúdo do arquivo na memória e fecha o mesmo Conteudo = (char*)malloc(Tamanho+1); fread(Conteudo, Tamanho, 1, Original); Conteudo[Tamanho] = '\0'; fclose(Original); // Marca as colunas da linha atual separando-as por \0 c = Conteudo; Indice_Coluna = 0; while (*c){ Coluna[Indice_Coluna] = c; if ((Env=Envolvedor(*c)) > -1){ if (Envolvedor_Saida == '\b') Coluna[Indice_Coluna]++; else if (Envolvedor_Saida) *c = Envolvedor_Saida; c++; while (*c && *c != Envolvedores_Fim[Env]) c++; if (Envolvedor_Fim_Saida == '\b') *(c++) = '\0'; else if (Envolvedor_Fim_Saida) *(c++) = Envolvedor_Fim_Saida; } while (*c && *c != '\n' && Nao_Delimitador(*c)) c++; if (!*c || *c == '\n'){ // Fim da linha int i; *(c++) = '\0'; if (argc == 3){ for (i=Indice_Coluna; i>0; i--){ if (Envolver_Todos && Envolvedor_Saida && Envolvedor_Saida != '\b' && Envolvedor_Saida != *Coluna[i]) fprintf(Saida, "%c", Envolvedor_Saida); fprintf(Saida, "%s", Coluna[i]); if (Envolver_Todos && Envolvedor_Fim_Saida && Envolvedor_Fim_Saida != '\b' && Envolvedor_Saida != *Coluna[i]) fprintf(Saida, "%c", Envolvedor_Fim_Saida); if (Separador_Saida) fprintf(Saida, "%c", Separador_Saida); else fprintf(Saida, "%c", Separador[i]); } if (Envolver_Todos && Envolvedor_Saida && Envolvedor_Saida != '\b' && Envolvedor_Saida != *Coluna[0]) fprintf(Saida, "%c", Envolvedor_Saida); fprintf(Saida, "%s", Coluna[0]); if (Envolver_Todos && Envolvedor_Fim_Saida && Envolvedor_Fim_Saida != '\b' && Envolvedor_Saida != *Coluna[0]) fprintf(Saida, "%c", Envolvedor_Fim_Saida); fprintf(Saida, "\n"); } else{ int Coluna_Atual; for (i=3; i Indice_Coluna){ if (Envolver_Todos && Envolvedor_Saida && Envolvedor_Saida != '\b') fprintf(Saida, "%c", Envolvedor_Saida); if (Envolver_Todos && Envolvedor_Fim_Saida && Envolvedor_Fim_Saida != '\b') fprintf(Saida, "%c", Envolvedor_Fim_Saida); if (Separador_Saida) fprintf(Saida, "%c", Separador_Saida); else fprintf(Saida, "%c", Separador[i-3]); } else{ if (Envolver_Todos && Envolvedor_Saida && Envolvedor_Saida != '\b' && Envolvedor_Saida != *Coluna[Coluna_Atual]) fprintf(Saida, "%c", Envolvedor_Saida); fprintf(Saida, "%s", Coluna[Coluna_Atual]); if (Envolver_Todos && Envolvedor_Fim_Saida && Envolvedor_Fim_Saida != '\b' && Envolvedor_Saida != *Coluna[Coluna_Atual]) fprintf(Saida, "%c", Envolvedor_Fim_Saida); if (Separador_Saida) fprintf(Saida, "%c", Separador_Saida); else fprintf(Saida, "%c", Separador[i-3]); } } Coluna_Atual = atoi(argv[argc-1])-1; if (Envolver_Todos && Envolvedor_Saida && Envolvedor_Saida != '\b' && (Coluna_Atual > Indice_Coluna || Envolvedor_Saida != *Coluna[Coluna_Atual])) fprintf(Saida, "%c", Envolvedor_Saida); if (Coluna_Atual <= Indice_Coluna) fprintf(Saida, "%s", Coluna[Coluna_Atual]); if (Envolver_Todos && Envolvedor_Fim_Saida && Envolvedor_Fim_Saida != '\b' && (Coluna_Atual > Indice_Coluna || Envolvedor_Saida != *Coluna[Coluna_Atual])) fprintf(Saida, "%c", Envolvedor_Fim_Saida); fprintf(Saida, "\n"); } Indice_Coluna = 0; } else{ // Delimitador Separador[Indice_Coluna] = *c; *(c++) = '\0'; Indice_Coluna++; } } fclose(Saida); return 0; } --------------------------------------------------------------------------- ******************************************************** ******************************************************** ********************************************************