¿Cómo imprimir los dos primeros campos de un archivo?

¿Cómo imprimir los dos primeros campos de un archivo?

Tengo un archivo con nombres de países y luego el prefijo del código de país móvil para ese país como este:

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

Necesito obtener el nombre del país y el prefijo del móvil. Entonces, la expresión regular se lee como: lea todas las palabras desde el principio de la línea y luego una cadena que comienza con un signo más y un dígito más y luego se detiene.

Intenté algunas cosas con grep, cut e incluso sed pero no puedo conseguirlo.

Respuesta1

prueba con:

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

[^+]*+coincide con todo hasta que +se encuentra por primera vez seguido de uno o más dígitos[0-9]\+

Respuesta2

Línea de comando:

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

Esto le proporcionará la información deseada de la entrada.

Laboral:

  • /^(.*?\+\d+)/regex extraerá todo hasta la primera aparición de un símbolo más seguido de al menos un símbolo de dígito.
  • Dado que esto está vinculado a BOLtravés del ^símbolo de intercalación, obviamente solo puede ocurrir una coincidencia.
  • La coincidencia se pasa a la printfunción.
  • -lneLas opciones son ejecutar Perlel código proporcionado en la -eopción en cada línea del archivo de entrada. -nhace que Perl no imprima nada a menos que se le solicite específicamente.

Producción:

United Kingdom   +44
United States Virgin Islands +1

Respuesta3

Desdetu dices espacioes el delimitador utilizado en su archivo, debería poder utilizar

cut -d ' ' -f 1-5 filename

para extraer las cinco primeras columnas del archivo.

Para los datos dados, esto produce

United Kingdom   +44
United States Virgin Islands +1

... pero supongo que esto es sólo por suerte, ya que un país con más de dos palabras en su nombre abarcaría varios campos (no sólo dos).

Un método más sólido sedpara eliminar todo lo que está después del primer conjunto de dígitos en cada línea (es decir, todo lo que está después del código de país):

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

o,

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

o, con -Ey una expresión regular extendida en su lugar,

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

información relacionada