ファイルから特定の値を抽出する

ファイルから特定の値を抽出する

このようなサンプルファイルがあります。

Zone A
Total Population 500 unit
Total Area 150 sq. unit
Zone B
Total Population 600 unit
Total Area 200 sq. unit
Zone C
Total Population 400 unit
Total Area 100 sq. unit

以下のように地域名と人口を抽出するには?

A
500
B
600
C
400

答え1

これはawkにとってマイナーな作業です。

awk '/Zone/{print $2} /Population/{print $3}' file

Zone現在の行にフィールドがある場合は、2番目のフィールドを印刷し、3番目のフィールドをPopulation印刷します。

答え2

この試み、

 awk '/Zone/ {print $2;getline; print $3}' file

A
500
B
600
C
400
  • getline現在の行の後の次の行を読みます。

答え3

grepPerl互換正規表現(PCRE)を使用してください。

grep -Po 'Zone \K.*|[0-9]+(?= unit)' file
  • -PPerl互換正規表現の有効化
  • -o一致する部分のみ印刷

  • Zone \K.*文字(.*)の後にZoneスペース文字が続くすべての文字と一致します。それ以前の内容はすべて\K印刷されません(幅0の前方ナビゲーション)。

  • |または
  • [0-9]+(?= unit)空白文字と後に続く1つ以上の数字と一致しますunit。幅がゼロの(?= unit)前方予測アサーションであり、対応するパターン(スペース文字とunit)も印刷されません。

答え4

次のコマンドで交換してくださいsed

$ sed -En '/Zone/N; s/Zone ([A-Z]+).+ ([0-9]+).*/\1\n\2/p' file
A
500
B
600
C
400

カバーシェル「地域名」+「地域値」:

$ sed -En '/Zone/N;N; s/Zone ([A-Z]+).+ ([0-9]+) sq.*/\1\n\2/p' file
A
150
B
200
C
100

関連情報