【问题标题】:Print rows that has numbers in it打印包含数字的行
【发布时间】:2017-12-04 08:57:25
【问题描述】:

这是我的数据 - 我有超过 1000 行。如何只获取带有数字的rec。

Records | Num

123 | 7 Y1 91

7834 | 7PQ34-102

AB12AC|87 BWE 67

5690278| 80505312

7ER| 998

输出必须是

7ER| 998

5690278| 80505312

我是 linux 编程新手,任何帮助都会对我非常有用。谢谢大家

【问题讨论】:

  • 如何在 linux/unix 中只打印第二列的数字? - 7ER 不在第二列
  • @RomanPerekhrest 标题有误导性,所以我改了
  • grep 解决方案:grep -P '.+\s*?\|\s*\d+$',对于基于列的过滤,awk 是最合适的工具。
  • 你是如何分隔列的?通过管道,或空格,或两者兼而有之?
  • @PS:更便携的是grep '|[[:space:]]*[[:digit:]]\{1,\}$'

标签: awk sed


【解决方案1】:

我会使用awk:

awk -F'[[:space:]]*[|][[:space:]]*' '$2 ~ /^[[:digit:]]+$/'

如果你想打印你在 cmets 中询问的删除的行数,你可以使用这个:

awk -F'[[:space:]]*[|][[:space:]]*' '
    {
        if($2~/^[[:digit:]]+$/){print}else{c++}
    }
    END{printf "%d lines deleted\n", c}' file

【讨论】:

  • 感谢您的答复。我没有得到任何结果。我需要输出文件中的 col 和“非数字”邮政编码。
  • 您好,我将$3 编辑为$2,希望它会提交给您进行审核和批准,但事实证明它是自动批准的。如果您不这么认为,请撤消更改。
  • 太棒了!绝对棒棒哒。我对您的解决方案获得的正确结果感到非常满意。我非常感谢你。我真的很希望一切顺利。现在很开心
  • @PS。 $2 将是 |
  • @user71597:可能最容易减去:expr $(wc -l < original_file) - $(wc -l < new_file)
【解决方案2】:

一个简短的 GNU awk (gawk) 脚本,用于过滤第二列(字段)中带有数字的行,假设一个单词字段(例如 1234,或12AB):

awk -F'|' '$2 ~ /\y[0-9]+\y/' file

我们使用GNU extension for regexp operators,即\y 来匹配单词边界。除此之外,非常简单:我们拆分 | 上的字段并在第二个字段中查找孤立的数字。

编辑:由于问题已更新,现在明确允许在第二个字段中多个单词(例如12 AB12-3412 34 ),在第二个字段中获取仅包含数字和分隔符的行:

awk -F'|' '$2 ~ /^[- 0-9]+$/' file

或者,如果我们说第二个字段中只禁止字母,我们可以使用:

awk -F'|' '$2 ~ /^[^a-zA-Z]+$/' file

【讨论】:

  • 谢谢!有问题,第二列包含像“87 BWE 67”这样的数据,上面的命令没有忽略。有没有办法解决这个问题
  • 我已经更新了答案以反映您修改和更新的问题。第二个和第三个表达式将,f.e.过滤掉12 aB 34,但通过123-456
  • 你好,我如何从不是 5 个连续数字的同一数据中的第二列中删除这些字段。请看这个stackoverflow.com/questions/44892071/…
  • 我回答了你第二个问题,你看看吧。
猜你喜欢
  • 2019-03-29
  • 2012-12-04
  • 1970-01-01
  • 2013-12-23
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
相关资源
最近更新 更多