根据邮政编码打印名称

时间:2017-10-09 11:29:24

标签: linux

我有一个格式如下的文本文件:

29:Jan:Høiberg:Darres gate 22:0175:Oslo:69215348 

基于此,如果邮政编码以该文本文件中的11,12或13开头,我想打印名字和姓氏。
相当新的linux,所以任何有关如何做到这一点的帮助都会很棒 在终端中执行此操作。

3 个答案:

答案 0 :(得分:1)

这不是效率最高的,但可行,但有一点需要注意的是,由于您没有指定数据中哪个列代表邮政编码,我认为它是第5列,即其中包含值为0175的列,但如果我的假定列号不代表邮政编码,则可以相应地更改以下代码。在您的终端中运行:

awk -F: 'IF match($5, /11.*/) > 0 || match($5, /12.*/) > 0 || match($5, /13.*/) > 0 {split($4, a, " "); print "Name is: ",$3, a[1], "with code:", $5}' persondata.txt

在样本数据persondata.txt上运行时:

29:Jan:Høiberg:Darres gate 22:0175:Oslo:11215348 
29:Jan:f1:l1 gate 22:1175:Oslo:11215348 
29:Jan:f2:l2 gate 22:1275:Oslo:11215348 
29:Jan:f3:l3 gate 22:0175:Oslo:11215348 
29:Jan:f4:l4 gate 22:01375:Oslo:11215348 
29:Jan:f5:l5 gate 22:12:Oslo:11215348

输出结果为:

Name is:  f1 l1 with code: 1175
Name is:  f2 l2 with code: 1275
Name is:  f4 l4 with code: 01375
Name is:  f5 l5 with code: 12

如果您只想打印姓名而不打印代码,请将print "Name is: ",$3, a[1], "with code:", $5替换为print "Name is: ",$3, a[1];

希望有所帮助:)

答案 1 :(得分:1)

有两个主要的"旧学校UNIX"接近这个的方法。一种是一体化的awk方法,它功能强大且干净,但很少有人能够流利使用它。

另一种是管道一起使用text-utils方法。

首先,我们要过滤掉您感兴趣的行。我们可以将该输出传输到另一个命令以打印您想要的字段。

所以:

egrep '^([^:]*:){4}1[123]' file.txt

我使用了egrep代替grep,因为它为我们{4}提供了#34}重复4次"。那就是

  • ^ - 行首
  • [^:]* - 除了'之外的任何字符的零个或多个出现:'
  • 后跟':#39;
  • {4} - 重复4次(注意()对要重复的部分进行分组)
  • 后跟1
  • 后跟123 - [123]

在添加下一步之前对您的数据进行测试;提取你需要的部分。在您显示的评论中,您已经知道如何使用cut

egrep '^([^:]*:){4}1[123]' file.txt | cut -d: -f2,3

答案 2 :(得分:1)

awk

$ awk -F: '$5~/1[123][0-9]*/ {gsub(/[ ].*/,"",$4); print $3,$4}' f1

如果您的第5个字段与此正则表达式匹配,则打印名字$3和姓氏$4,直到空格。

从@ tkhurana96获取输入文件。谢谢

<强>输入:

29:Jan:Høiberg:Darres gate 22:0175:Oslo:11215348 
29:Jan:f1:l1 gate 22:1175:Oslo:11215348 
29:Jan:f2:l2 gate 22:1275:Oslo:11215348 
29:Jan:f3:l3 gate 22:0175:Oslo:11215348 
29:Jan:f4:l4 gate 22:01375:Oslo:11215348 
29:Jan:f5:l5 gate 22:12:Oslo:11215348

<强>输出

f1 l1
f2 l2
f4 l4
f5 l5