Как распечатать первые два поля в файле?

Как распечатать первые два поля в файле?

У меня есть файл с названиями стран и префиксом мобильного кода страны для этой страны, например:

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

Мне нужно получить название страны и мобильный префикс. Поэтому регулярное выражение выглядит так: прочитать все слова с начала строки, а затем строку, которая начинается с плюса и еще одной цифры, а затем остановиться.

Я пробовал кое-что с grep, cut и даже sed, но ничего не получилось.

решение1

попробуйте с:

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

[^+]*+соответствует всему, пока не +будет найден первый символ, за которым последует одна или несколько цифр[0-9]\+

решение2

Командная строка:

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

Это позволит вам получить желаемую информацию из входных данных.

Работающий:

  • /^(.*?\+\d+)/Регулярное выражение извлечет все до первого вхождения символа плюс, за которым следует по крайней мере один символ цифры.
  • Поскольку это связано с символом « BOLкаретка ^», очевидно, что может произойти только одно совпадение.
  • Сопоставление передается функции print.
  • -lneпараметры запускают Perlкод, указанный в -eпараметре, в каждой строке входного файла. -nзаставляет Perl не печатать ничего, если об этом специально не указано.

Выход:

United Kingdom   +44
United States Virgin Islands +1

решение3

Сты говоришь космосявляется разделителем, используемым в вашем файле, вы должны иметь возможность использовать

cut -d ' ' -f 1-5 filename

для извлечения первых пяти столбцов из файла.

Для приведенных данных это дает

United Kingdom   +44
United States Virgin Islands +1

... но я предполагаю, что это всего лишь удача, поскольку страна, в названии которой содержится более двух слов, будет охватывать несколько областей (а не только две).

Более надежный метод, использующий sedудаление всего после первого набора цифр в каждой строке (т.е. всего после кода страны):

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

или,

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

или, -Eвместо этого, с расширенным регулярным выражением,

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

Связанный контент