根据值提取列

时间:2018-03-24 03:56:36

标签: bash awk sed

如何仅提取仅包含1个数据的列,以:

分隔
demo@example.com:bo:mo
demo1@example.com::
demo2@example.com::

期望的输出

demo1@example.com::
demo2@example.com::

我的上一个命令试试

sed "${var%%::*}::"

2 个答案:

答案 0 :(得分:0)

关注简单awk可能对您有所帮助。

awk -F":" '{for(i=1;i<=NF;i++){if($i){count++}};if(count==1){print};count=""}'  Input_file

或者以不同的形式使用相同的逻辑。

awk -F":" '{for(i=1;i<=NF;i++){count=$i?++count:count}} count==1{print} {count=""}' Input_file

答案 1 :(得分:0)

啊 - 从评论中我推断,除了第一个外,所有字段都是空的。然后更简单:

echo "demo@example.com:bo:mo
demo1@example.com:bo:
demo2@example.com::" | sed -n "/::/p"

sed -n表示默认情况下不打印&#39;。 / :: /是要查找的模式,&#39; p&#39;如果图案匹配,则表示打印。

只打印第一列的内容:

echo "demo@example.com:bo:mo
demo1@example.com:bo:
demo2@example.com::" | sed -rn "s/(.*)::/\1/p"
demo2@example.com

-r表示扩展的正则表达式,这对于在冒号之前捕获一切的圆括号非常重要。 \ 1是打印的反向引用。