AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 460276
Accepted
Curious Sam
Curious Sam
Asked: 2018-08-04 01:35:06 +0800 CST2018-08-04 01:35:06 +0800 CST 2018-08-04 01:35:06 +0800 CST

Como formatar as últimas 3 colunas de um arquivo começando na 30ª guia ou 88º espaço

  • 772

Ubuntu 16.04 GNU bash, versão 4.4.0

Gostaria de formatar este arquivo de texto arquivado com CEPs contendo 1.264.524 linhas.

#!/bin/bash

wget http://download.geonames.org/export/zip/allCountries.zip
unzip allCountries.zip
mv -f allCountries.txt .allCountries.txt
rm -f allCountries.zip

Esta é uma seção do arquivo não formatada.

AD AD100 Canillo                    42.5833  1.6667   6
AD AD200 Encamp                     42.5333  1.6333   6
AD AD300 Ordino                     42.6  1.55  6
AD AD400 La Massana                    42.5667  1.4833   6
AD AD500 Andorra la Vella                    42.5  1.5   6
AD AD600 Sant Julià de Lòria                    42.4667  1.5   6
AD AD700 Escaldes-Engordany                     42.5  1.5667   6
AR 3636  POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S))  Salta A              -23.4933 -61.9267 3
AR 4123  LAS SALADAS Salta A              -25.7833 -64.5 4
AR 4126  BARADERO Salta A              -26.0833 -65.263  3
AR 4126  EL CUIBAL   Salta A              -26.0833 -65.263  3
AR 4126  LA ASUNCION Salta A              -26.0833 -65.263  3
AR 4126  MIRAFLORES (TALA, DPTO. CANDELARIA) Salta A              -26.0833 -65.263  3
AR 4141  TOLOMBON Salta A              -26.2 -65.9167 4
AR 4141  QUISCA GRANDE  Salta A              -26.4367 -65.97   3
AR 4141  LA CIENEGUITA  Salta A              -26.4367 -65.97   3
AR 4141  MACHO RASTROJO Salta A              -26.4367 -65.97   3
AR 4190  ROSARIO DE LA FRONTERA  Salta A              -25.8 -64.9667 4
AR 4190  OVANDO   Salta A              -25.8 -65.1 4
AR 4190  SAN ESTEBAN Salta A              -25.8 -65.0333 3
AR 4190  LA BANDA (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA)  Salta A              -25.8 -65.0333 3
AR 4190  LA MATILDE  Salta A              -25.8 -65.0333 3
AR 4190  LAS PIEDRITAS  Salta A              -25.8 -65.0333 3
AR 4190  LOS POCITOS Salta A              -25.8 -65.0333 3
AR 4190  OJO DE AGUA (ROSARIO DE LA FRONTERA, DPTO. R.DE LA FRONTERA)   Salta A              -25.8 -65.0333 3
AR 4190  POTRERILLO (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA)   Salta A              -25.8 -65.0333 3

Este deve ser o resultado final:

AD AD100 Canillo                                                                          42.5833     1.6667      6
AD AD200 Encamp                                                                           42.5333     1.6333      6
AD AD300 Ordino                                                                           42.6        1.56        6
AD AD400 La Massana                                                                       42.5667     1.4833      6
AD AD500 Andorra la Vella                                                                 42.5        1.6         6
AD AD600 Sant Julià de Lòria                                                              42.4667     1.5         6
AD AD700 Escaldes-Engordany                                                               42.5        1.5667      6
AR 3636  POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S))  Salta A                       -23.4933    -61.9267    3
AR 4123  LAS SALADAS Salta A                                                              -25.7833    -64.5       4
AR 4126  BARADERO Salta A                                                                 -26.0833    -65.263     3
AR 4126  EL CUIBAL   Salta A                                                              -26.0833    -65.263     3
AR 4126  LA ASUNCION Salta A                                                              -26.0833    -65.263     3
AR 4126  MIRAFLORES (TALA, DPTO. CANDELARIA) Salta A                                      -26.0833    -65.263     3
AR 4141  TOLOMBON Salta A                                                                 -26.2       -65.9167    4
AR 4190  OJO DE AGUA (ROSARIO DE LA FRONTERA, DPTO. R.DE LA FRONTERA)   Salta A           -25.8       -65.0333    3
AR 4190  POTRERILLO (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA)   Salta A           -25.8       -65.0333    3

Portanto, a 30ª tabulação ou 88 espaços da esquerda da 3ª à última coluna deve começar. O primeiro caractere nas últimas 3 colunas está separado por 12 espaços.

Cada linha tem dados, então tentei cortar as últimas 3 colunas em outro arquivo. Então tentei remover todos os espaços em branco do arquivo original e formatá-lo em colunas. A terceira coluna me dá problemas porque se não

awk 'BEGIN{ OFS="\t"}{ print $1, $2, NR }' .allCountries.txt

AT      4873    Pehigen 34069
AT      4873    Hofberg 34070
AT      4873    Wiederhals      34071
AT      4873    Oberedt 34072
AT      4873    Oberegg 34073
AT      4873    Raitenberg      34074
AT      4873    Redltal 34075
AT      4873    Friedhalbing    34076
AT      4873    Unterhaselbach  34077
AT      4873    Redltal 34078
AT      4873    Erkaburgen      34079
AT      4873    Mayrhof 34080
AT      4873    Erdpries        34081
AT      4873    Grünbergsiedlung        34082
AT      4873    Brunnhölzl      34083
AT      4873    Seibrigen       34084
AT      4873    Kinast  34085
AT      4873    Stöckert        34086
AT      4873    Frankenburg     34087
AT      4873    Fischeredt      34088
AT      4873    Marigen 34089
AT      4873    Oberhaselbach   34090
AT      4873    Ottokönigen     34091
AT      4873    Fischigen       34092
AT      4873    Endriegl        34093

Qualquer ajuda seria grande.

awk cut
  • 2 2 respostas
  • 150 Views

2 respostas

  • Voted
  1. Best Answer
    steve
    2018-08-04T07:13:49+08:002018-08-04T07:13:49+08:00

    Isto parece fazê-lo. Sendo uma simples linha de awk, ele deve ser executado rapidamente em um arquivo de linha de 1,2 m. Ao criar um arquivo fictício de 1,3 milhão de linhas, com base em sua amostra, eu o vi completo em 24 segundos em uma VM CentOS 7 básica com 4 GB de memória e GNU Awk 4.0.2.

    Para obter algumas respostas precisas do StackExchange, você pode postar sua entrada de amostra no pastebin, junto com a saída de amostra.

    $ awk '{printf "%s %-6s%-81s%-12s%-12s%s\n",$1,$2,gensub(/[0-9.-]* +[0-9.-]* +[0-9]$/,"","g",substr($0,10)),$(NF-2),$(NF-1),$NF}' inp | head
    AD AD100 Canillo                                                                          42.5833     1.6667      6
    AD AD200 Encamp                                                                           42.5333     1.6333      6
    AD AD300 Ordino                                                                           42.6        1.55        6
    AD AD400 La Massana                                                                       42.5667     1.4833      6
    AD AD500 Andorra la Vella                                                                 42.5        1.5         6
    AD AD600 Sant Julià de Lòria                                                              42.4667     1.5         6
    AD AD700 Escaldes-Engordany                                                               42.5        1.5667      6
    AR 3636  POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S))  Salta A                       -23.4933    -61.9267    3
    AR 4123  LAS SALADAS Salta A                                                              -25.7833    -64.5       4
    AR 4126  BARADERO Salta A                                                                 -26.0833    -65.263     3
    $
    

    Experimente on-line!

    • 1
  2. jesse_b
    2018-08-04T05:53:49+08:002018-08-04T05:53:49+08:00

    Consegui realizar o que acredito que você deseja com o script a seguir, embora não tenha certeza de como funcionará em mais de 1 mil linhas.

    #!/usr/local/bin/bash
    
    tmp_dir="$(mktemp -d -t 'text.XXXXX' || mktemp -d 2>/dev/null)"
    input=./input
    output=./output
    tmp_input1=${tmp_dir}/temp_input1.txt
    tmp_input2=${tmp_dir}/temp_input2.txt
    col1="${tmp_dir}/col1.txt"
    col2="${tmp_dir}/col2.txt"
    col3="${tmp_dir}/col3.txt"
    col4="${tmp_dir}/col4.txt"
    col5="${tmp_dir}/col5.txt"
    col6="${tmp_dir}/col6.txt"
    
    tr -s ' ' <"$input" > "$tmp_input1"
    
    awk '{print $1}' "$tmp_input1" > "$col1"
    
    awk '!($1="")' "$tmp_input1" > "$tmp_input2"
    
    awk '{print $1}' "$tmp_input2" > "$col2"
    
    awk '!($1="")' "$tmp_input2" > "$tmp_input1"
    
    awk '{print $NF}' "$tmp_input1" > "$col6"
    
    awk '!($NF="")' "$tmp_input1" > "$tmp_input2"
    
    awk '{print $NF}' "$tmp_input2" > "$col5"
    
    awk '!($NF="")' "$tmp_input2" > "$tmp_input1"
    
    awk '{print $NF}' "$tmp_input1" > "$col4"
    
    awk '!($NF="")' "$tmp_input1" > "$tmp_input2"
    
    cat "$tmp_input2" > "$col3"
    
    paste -d'\t' "$col1" "$col2" "$col3" "$col4" "$col5" "$col6"  | column -s$'\t' -t > "$output"
    
    rm -r "$tmp_dir"
    

    Isso cria vários arquivos tmp (um para cada coluna e dois para modificação do arquivo original) e processa através de sua entrada original, removendo uma coluna de cada vez até ficar com a coluna 3. Em seguida, cola todos os arquivos tmp juntos separados por tabulação e usa columnpara formatar essa saída como desejar.

    Com sua entrada dada:

    $ ./script.sh
    $ cat output
    AD  AD100  Canillo                                                                42.5833   1.6667    6
    AD  AD200  Encamp                                                                 42.5333   1.6333    6
    AD  AD300  Ordino                                                                 42.6      1.55      6
    AD  AD400  La Massana                                                             42.5667   1.4833    6
    AD  AD500  Andorra la Vella                                                       42.5      1.5       6
    AD  AD600  Sant Julià de Lòria                                                    42.4667   1.5       6
    AD  AD700  Escaldes-Engordany                                                     42.5      1.5667    6
    AR  3636   POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S)) Salta A              -23.4933  -61.9267  3
    AR  4123   LAS SALADAS Salta A                                                    -25.7833  -64.5     4
    AR  4126   BARADERO Salta A                                                       -26.0833  -65.263   3
    AR  4126   EL CUIBAL Salta A                                                      -26.0833  -65.263   3
    AR  4126   LA ASUNCION Salta A                                                    -26.0833  -65.263   3
    AR  4126   MIRAFLORES (TALA, DPTO. CANDELARIA) Salta A                            -26.0833  -65.263   3
    AR  4141   TOLOMBON Salta A                                                       -26.2     -65.9167  4
    AR  4141   QUISCA GRANDE Salta A                                                  -26.4367  -65.97    3
    AR  4141   LA CIENEGUITA Salta A                                                  -26.4367  -65.97    3
    AR  4141   MACHO RASTROJO Salta A                                                 -26.4367  -65.97    3
    AR  4190   ROSARIO DE LA FRONTERA Salta A                                         -25.8     -64.9667  4
    AR  4190   OVANDO Salta A                                                         -25.8     -65.1     4
    AR  4190   SAN ESTEBAN Salta A                                                    -25.8     -65.0333  3
    AR  4190   LA BANDA (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA) Salta A     -25.8     -65.0333  3
    AR  4190   LA MATILDE Salta A                                                     -25.8     -65.0333  3
    AR  4190   LAS PIEDRITAS Salta A                                                  -25.8     -65.0333  3
    AR  4190   LOS POCITOS Salta A                                                    -25.8     -65.0333  3
    AR  4190   OJO DE AGUA (ROSARIO DE LA FRONTERA, DPTO. R.DE LA FRONTERA) Salta A   -25.8     -65.0333  3
    AR  4190   POTRERILLO (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA) Salta A   -25.8     -65.0333  3
    
    • 0

relate perguntas

  • remova o número de linhas duplicadas com base na correspondência antes da primeira vírgula

  • anexar linhas após outros arquivos linha por linha

  • Como remover uma única linha entre duas linhas

  • Reorganize as letras e compare duas palavras

  • Embaralhamento de arquivo de várias linhas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve