[英]grep pattern to exclude negative numbers from file
我一直在努力想出一个更简单的答案来解决这个问题。 但仍然使用grep。
我想要查看myfile.dat的正(和负数)。 Myfile.dat看起来像这样:
-1.4987 4.1354 -8.1235
4.2322 -0.9842 -2.6845
3.6845 1.5132 -2.8452
0.0122 9.3542 -1.2354
-7.2127 -1.1253 -4.3967
0.3535 7.2416 -3.1277
无需保留列格式。 所以我使用了以下grep模式。
负数:
grep -E -o [-][0-9]+.[0-9]+ myfile.dat
正数(这里我必须将所有数字输入另一个grep):
grep -Eo [-]\?[0-9]+.[0-9]+ myfile.dat | grep -v [-]
这是问题所在! 是否有grep模式允许我直接提取正数,而不使用第二个grep命令?
这完全是关于模式,而不是我是否可以使用另一个命令。
使用grep -P
可以执行此操作以获取所有正数:
grep -oP '(?<!-)\b[0-9]+\.[0-9]+\b' file
你可以匹配数字之前的行首或空格:
$ grep -oE '(^| )[0-9]+\.[0-9]+' Myfile.dat | tr -d ' '
4.1354
4.2322
3.6845
1.5132
0.0122
9.3542
0.3535
7.2416
tr -d ' '
只是从输出中删除任何初始空格,如果不需要,可以跳过它。
如果要保留列格式,可以使用BASH read
循环。
循环遍历每行的数组以检查和取消设置每个负数元素。
while read -a n; do
for i in ${!n[@]}; do
if [[ ${n[$i]} =~ ^- ]]; then
unset n[$i]
fi
done
if [[ -n $n ]]; then
echo ${n[@]}
fi
done < myfile.dat
你能用sed而不是grep吗? 删除负数:
sed "s/-[0-9.]*//g; s/^ //" myfile.dat
删除减号的每个序列,后跟数字和点s/-[0-9.]*//g
。 并美化删除任何可能保留s/^ //
前导空格。
只保留正数会有点棘手。
sed "s/^[0-9.]*//; s/ [0-9.]*/ /g; s/^ *//" myfile.dat
删除行s/^[0-9.]*//
开头的数字和点。 用空白s [0-9.]*/ /g
替换空白,后跟数字和点。 最后再次美化,删除行s/^ *//
开头的剩余前导空白。 (可能有一种更简单的方法,但目前看不到它。)
好的,已经提供了sed,grep和pure shell的解决方案,我给awk一个。 事实上,我没有得到所提供的答案,当问题涉及计算时,为什么要使用一些不利于计算的工具。
awk '{for (i=1;i<=NF;i++) if ($i>=0) print $i} ' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.