从第2列删除所有不是5个连续数字的字段

时间:2017-07-03 18:36:39

标签: awk sed grep

 Record | RegistrationID

 41-1|10551
 1-105|5569
  4-7|10043
  78-3|2176
   3-1|19826
   12-1|1981

输出文件必须

 Record | RegistrationID
1-1|10551
3-1|19826
5-7|10043

我的文件是管道分隔

必须删除第二列中小于或大于5lenght的任何数字,即只有具有5个连续数字的记录必须保留。我在谷歌一小时内解决这个问题所给出的任何建议都会非常明显。提前谢谢

尝试了这个grep -E'[0-9] {5} $ | $'文件名 - >没有得到任何结果,tx到cyrus

3 个答案:

答案 0 :(得分:0)

如果这不符合您的要求:

$ awk '(NR==1) || ($NF~/^[0-9]{5}$/)' file
 Acno | Zip
 high | 12345
tyty | 19812

然后您的真实输入文件与您在示例中提供的格式不匹配,如果您需要更多帮助,则必须自己跟进以找出差异并发布更具真实代表性的示例输入。< / p>

鉴于您更新的输入文件,| s周围没有空格:

$ awk -F'|' '(NR==1) || ($NF~/^[0-9]{5}$/)' file
 Acno | Zip
 45775-1|10551
  2734455-7|10043
   167115-1|19826

如果您的输入中确实有一个领先的空白区域,您希望从输出中轻松删除,但我现在要假设您实际上并没有真正拥有这种情况而且您的输入中存在更多错误发布了样本输入文件。

使用gawk 3.1.7作为OP(见下面的评论):

awk --re-interval -F'|' '(NR==1) || ($NF~/^[0-9]{5}$/)' file

答案 1 :(得分:0)

如果你的列(字段)是| - 分隔,可能包含空格,过滤条件恰好是第二个字段中的5位数,那么试试这个:

awk -F'|' '$2 ~ /^[ ]*[0-9]{5}[ ]*$/' file

此外,要另外传递标题(第一行):

awk -F'|' 'NR==1 || $2 ~ /^[ ]*[0-9]{5}[ ]*$/' file

答案 2 :(得分:-1)

添加--re-interval选项以支持正则表达式中的区间表达。

gawk --re-interval -F'|' '$NF~/^[0-9]{4,5}$/' file