我有一个文本文件,格式如下:
29:Jan:Høiberg:Darres gate 22:0175:Oslo:69215348 在此基础上,如果邮政编码从文本文件中的11、12或13开始,我想打印名字和姓氏。
对于linux来说,这是很新的,所以任何关于如何做到这一点的帮助都是很棒的。
在终点站做这个。
发布于 2017-10-09 13:16:04
有两种主要的“旧式UNIX”方法来解决这个问题。一种是全合一的awk方法,这是强大而干净的,但很少有人能流利地使用它。
另一种是管道-组合-文本-使用方法。
首先,我们要过滤掉你感兴趣的线路。我们可以将输出传输到另一个命令,以打印您想要的字段。
所以:
egrep '^([^:]*:){4}1[123]' file.txt我使用了egrep而不是grep,因为它给了我们“重复4次”的{4}。所以这就是
^ --线的开始[^:]* -除“:”外,任何字符均为零或更多次出现{4} -重复4次(注意()分组要重复的部分)11,2或3 -- [123]在添加下一步之前,先对数据进行测试;提取所需的部件。在您展示的注释中,您已经知道如何使用cut
egrep '^([^:]*:){4}1[123]' file.txt | cut -d: -f2,3发布于 2017-10-09 12:26:19
这并不是最有效的方法,但会有效的,尽管有一点要注意的是,由于您没有在数据中指定哪个列表示邮政编码,所以我假设它是列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];
希望它有帮助:)
发布于 2017-10-09 16:25:43
awk
$ awk -F: '$5~/1[123][0-9]*/ {gsub(/[ ].*/,"",$4); print $3,$4}' f1如果您的第五个字段与这个regex匹配,那么打印名字$3和姓氏$4直到空格。
从@tkhurana96 96获取输入文件。谢谢
输入:
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 l5https://stackoverflow.com/questions/46645373
复制相似问题