簡體   English   中英

grep模式從文件中排除負數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM