Processo de arquivo imprime os últimos 2 caracteres das primeiras colunas e o restante

0

Eu tenho o arquivo de entrada com 11 colunas e esses arquivos precisam ser processados, as primeiras colunas devem ser exibidas nos últimos 2 dígitos e o restante das colunas. Campos são separados por vírgulas. Eu tentei alguns comandos, mas não obter resultado adequado.Preciso de um script de shell para este meu arquivo com mais registros   

entrada

9303176179,989303176179,15335,A,1,9,1,0,201712091400,0,0
9303138379,989303138379,15335,A,1,9,1,0,201712091400,0,0
9302922849,989302922849,15335,A,1,9,1,0,201712091400,0,0
9334284759,989334284759,15335,A,1,9,1,0,201712091400,0,0
9334200459,989334200459,15335,A,1,9,1,0,201712091400,0,0
9334022869,989334022869,15335,A,1,9,1,0,201712091400,0,0
9334499819,989334499819,15335,A,1,9,1,0,201712091400,0,0
9334036329,989334036329,15335,A,1,9,1,0,201712091400,0,0
9303053859,989303053859,15335,A,1,9,1,0,201712091400,0,0
9302997519,989302997519,15335,A,1,9,1,0,201712091400,0,0

Produção esperada

79,989303176179,15335,A,1,9,1,0,201712091400,0,0
79,989303138379,15335,A,1,9,1,0,201712091400,0,0
49,989302922849,15335,A,1,9,1,0,201712091400,0,0
59,989334284759,15335,A,1,9,1,0,201712091400,0,0
59,989334200459,15335,A,1,9,1,0,201712091400,0,0
69,989334022869,15335,A,1,9,1,0,201712091400,0,0
19,989334499819,15335,A,1,9,1,0,201712091400,0,0
29,989334036329,15335,A,1,9,1,0,201712091400,0,0
59,989303053859,15335,A,1,9,1,0,201712091400,0,0
19,989302997519,15335,A,1,9,1,0,201712091400,0,0
    
por Arun Binoy 08.12.2017 / 15:57

2 respostas

2

Eu não sei quais ferramentas você tem tentado, mas eu uso sed para esse tipo de coisa:

sed 's/^[^,]*\([^,][^,],.*$\)//g'

Você pode usar isso como um filtro ( sed ... <InFile >OutFile ) ou usar a opção -i para atualizar um nome de arquivo que você adicionaria à cadeia de execução ( sed -i ... InFile ).

Isso pesquisa cada linha, procurando os dois últimos caracteres antes da primeira vírgula usando [^,] para corresponder a qualquer caractere, exceto uma vírgula. Em seguida, ele inicia um campo de correspondência antes desses dois caracteres com \( e finaliza o campo de correspondência no final da linha com \) . Então, este campo de correspondência substitui a expressão de correspondência inteira, que começa no início da linha.

Eu costumo usar expressões regulares, então acho simples escrever isso, mas sou o primeiro a admitir que são difíceis de aprender.

    
por 08.12.2017 / 16:20
2

Use cut e paste :

paste -d, <(cut -f1 -d, input.csv | rev | cut -c1,2 | rev) \
          <(cut -f2- -d, input.csv)

Como cut não pode contar os caracteres da direita, usei rev para reverter cada número na primeira coluna, depois extraí os dois primeiros caracteres com cut e reverti novamente.

    
por 08.12.2017 / 16:07