Como imprimir os dois primeiros campos de um arquivo?

Como imprimir os dois primeiros campos de um arquivo?

Eu tenho um arquivo com nomes de países e, em seguida, o prefixo do código do país móvel para esse país, assim:

United Kingdom   +44  ...more fields
United States Virgin Islands +1  ...more fields

Preciso obter o nome do país e o prefixo do celular. Portanto, a expressão regular é assim: leia todas as palavras desde o início da linha e depois uma string que começa com um sinal de mais e mais um dígito e depois pare.

Tentei algumas coisas com grep, cut e até sed, mas não consigo.

Responder1

tente com:

grep -o '^[^+]*+[0-9]\+' infile

[^+]*+corresponde a tudo até +ser encontrado pela primeira vez, seguido por um ou mais dígitos[0-9]\+

Responder2

Linha de comando:

$ perl -lne 'print /^(.*?\+\d+)/' input.txt

Isso fornecerá as informações desejadas da entrada.

Trabalhando:

  • /^(.*?\+\d+)/regex deve extrair tudo até a primeira ocorrência de um símbolo de mais seguido por pelo menos um símbolo de dígito.
  • Como isso está vinculado ao símbolo BOLdo ^cursor, obviamente apenas uma correspondência pode acontecer.
  • A correspondência é passada para a printfunção.
  • -lneas opções são para executar Perlo código fornecido na -eopção em cada linha do input.file. -nfaz com que o perl não imprima nada, a menos que seja especificamente solicitado.

Saída:

United Kingdom   +44
United States Virgin Islands +1

Responder3

Desdevocê diz espaçoé o delimitador usado em seu arquivo, você poderá usar

cut -d ' ' -f 1-5 filename

para extrair as cinco primeiras colunas do arquivo.

Para os dados fornecidos, isso produz

United Kingdom   +44
United States Virgin Islands +1

... mas presumo que isso seja apenas uma questão de sorte, já que um país com mais de duas palavras em seu nome abrangeria vários campos (não apenas dois).

Um método mais robusto sedpara excluir tudo após o primeiro conjunto de dígitos em cada linha (ou seja, tudo após o código do país):

sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename

ou,

sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename

ou, com -Euma expressão regular estendida,

sed -E 's/([[:digit:]]+).*/\1/' filename

informação relacionada