ファイルの最初の2つのフィールドを印刷するには?

ファイルの最初の2つのフィールドを印刷するには?

次のように、国名とその国のモバイル国コードプレフィックスを含むファイルがあります。

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

国名と携帯電話番号を知る必要があります。したがって、正規表現は次のようになります。行の先頭からすべての単語を読み、プラス記号と1つ以上の数字で始まる文字列を読み、停止します。

grep、cut、sedでもいくつか試してみましたが取得できません。

答え1

努力する:

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

[^+]*+最初に+見つかり、その後に1つ以上の数字が来るまで、すべての項目と一致します。[0-9]\+

答え2

コマンドライン:

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

これにより、入力から必要な情報を取得できます。

布材:

  • /^(.*?\+\d+)/正規表現は、プラス記号が最初に表示されるまですべてを抽出し、その後に少なくとも1つの数字記号が続きます。
  • BOLこれはカラットを介して接続されているため、^明らかに1回の一致のみが発生する可能性があります。
  • 一致がprint関数に渡されます。
  • -lneoptionsは、input.fileの各行のオプションでPerl指定されたコードを実行するために使用されます。 Perlは特に要求しない限り何も印刷しません。-e-n

出力:

United Kingdom   +44
United States Virgin Islands +1

答え3

~からあなたは言う スペースファイルに使用される区切り記号。利用できる必要があります。

cut -d ' ' -f 1-5 filename

ファイルから最初の5列を抽出します。

与えられたデータに対して、これは次のようになります。

United Kingdom   +44
United States Virgin Islands +1

...しかし、名前に2つ以上の単語がある国は(ただ2つではなく)複数の領域にまたがっているので、これは幸運であると仮定します。

sed各行の最初の数値セットの後のすべての項目(国コードの後のすべての項目)を削除するより信頼性の高い方法:

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

または、

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

または代わりに-E拡張正規表現を使用してください。

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

関連情報