根据值的长度删除条目

时间:2017-07-02 19:51:30

标签: linux shell

如果最后一列包含少于2个值,则将删除整行

示例数据:

18106|1.0.4.0/22|223 121 1836
3549|1.0.10.0/24|421 21 
5413|1.0.0.0/16|789 
2152|1.4.0.0/16|745 89 1876
3549|1.0.8.0/22|680

预期产出:

18106|1.0.4.0/22|223 121 1836
3549|1.0.10.0/24|421 21 
2152|1.4.0.0/16|745 89 1876

有什么办法吗?

2 个答案:

答案 0 :(得分:0)

awk 解决方案:

awk -F'\\|' 'split($NF,a," ")>=2' file

输出:

18106|1.0.4.0/22|223 121 1836
3549|1.0.10.0/24|421 21 
2152|1.4.0.0/16|745 89 1876
  • split($NF,a," ") - 按空格拆分最后一个字段并返回块数

答案 1 :(得分:0)

如果单个值后面没有空格,您可以在最后|之后删除没有空格的行:

grep -v '|[^ |]*$'
  • [...]是一个角色类。 [ |]匹配空格或|
  • 字符类中的
  • ^否定它,即[^ |]匹配除空格或|之外的任何内容。
  • *表示"重复零次或多次"
  • $匹配行尾
  • -v显示与
  • 匹配的
  • 所以整个事情意味着"跳过包含竖线的线条,后跟不同于空格和竖线的字符,直到线的末尾"

它不适用于你的样本数据,因为789之后还有一个空格。所以,在最后|之后检查空格,然后是非空格:

grep '|[^ |]\+ [^ |]\+' 

此处,\+表示"重复一次或多次"。