我确定这个问题的答案已经在线,但我不知道我在找什么。我刚刚开始学习Unix / Linux课程,我爸爸让我为他的工作做点什么。他有一个文本文件,每隔四行就有一个10位数字。我如何列出数字列表?我假设文件看起来像这样:
Random junk
Random junk fake number 1234567809
Random junk
My phone number is 1234567890 and it is here random numbers 32131;1231
Random junk
Random junk another fake number 2345432345
Random junk
Just kidding my phone number is here 1234567890 the date is mon:1231:31231
我假设它像grep [1-9].\{9\}
文件,但我如何得到第4,8,12行等等。因为我测试了它,我得到了每一行的所有电话号码。另外,我如何获得数字而不是整行?
任何帮助都将受到高度赞赏,即使它指向正确的方向,所以我可以自己研究。感谢。
答案 0 :(得分:6)
您可以分两步完成:
$ awk '!(NR%4)' file | grep -Eo '[0-9]{10}'
1234567890
1234567890
awk '!(NR%4)' file
打印数量为4的倍数的行。与说awk '(NR%4==0) {print}' file
相同。grep -Eo '[0-9]{10}'
打印10个块上显示的数字。请注意-o
用于“只打印匹配”,-E
用于使用扩展正则表达式。或者
$ awk '!(NR%4)' file | grep -Eo '[1-9][0-9]{9}' #check if first number is <>0
答案 1 :(得分:1)
使用GNU sed
:
sed -nr '0~4{s/.*\b([0-9]{10})\b.*/\1/p}' inputfile
说0~4
从第0行开始每隔4行产生一次,即产生文件中的每4行。替换部分相当明显。
对于您的样本输入,它会产生:
1234567890
1234567890
答案 2 :(得分:1)
由于您每行都在寻找一个数字,因此awk解决方案将涉及
awk '!(NR%4) && match($0, /[[:digit:]]{10}/){print substr($0, RSTART, RLENGTH)}' file
答案 3 :(得分:1)
使用perl
:
$ perl -nle 'print /([0-9]{10})/ if !($.%4)' file
1234567890
1234567890
答案 4 :(得分:0)
要解决此问题,首先,您应该知道电话号码的长度。您还应该考虑代码识别的区号以及可能的电话号码起始号码。这样,您将只过滤最可能的真实数字。但如果我写'#34;我的电话号码是028 2233 5674 ......开玩笑吧,它是028 2233 9873。&#34;然后代码会认为这两个数字都是正确的。所以,要完全解决这个问题,如果文本中有假数字,几乎是不可能的。但是智能代码会过滤那些最可能正确的代码。