我一直在努力想出一个更简单的答案来解决这个问题。但仍在使用grep。
我想对myfile.dat的正数(和负数)进行grep。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命令?
这都是关于模式的,而不是我是否可以使用另一个命令。
发布于 2014-02-05 03:05:52
使用grep -P,您可以执行以下操作以获得所有正数:
grep -oP '(?<!-)\b[0-9]+\.[0-9]+\b' file发布于 2014-02-05 03:10:06
您可以在行首或数字前的空格上进行匹配:
$ 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.2416tr -d ' '只是从输出中删除任何开头的空格,如果不需要,您可以跳过它。
发布于 2014-02-05 03:42:35
如果希望保留列格式,可以使用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.dathttps://stackoverflow.com/questions/21561101
复制相似问题