ファイルの最初の 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
  • -lneオプションは、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

関連情報