我有一个这样的示例文件。
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
中有,则打印第二个字段;对于Population
,打印第三个。
答案2
尝试这个,
awk '/Zone/ {print $2;getline; print $3}' file
A
500
B
600
C
400
getline
读取当前行之后的下一行。
答案3
使用grep
与 perl 兼容的正则表达式 (PCRE):
grep -Po 'Zone \K.*|[0-9]+(?= unit)' file
-P
启用 Perl 兼容的正则表达式-o
只打印匹配的部分Zone \K.*
匹配 (.*
) 后面Zone
加一个空格字符的任何字符。之前的所有内容\K
都不会被打印(零宽度正向后查找)。|
或者[0-9]+(?= unit)
匹配一个或多个数字,后跟一个空格字符和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