簡體   English   中英

使用awk刪除尾隨零

[英]remove trailing zero using awk

我的文件中包含以下值:

1.5000
 0.006
 9.0001
 104.2500
 17.0000
 3.5000

我想刪除尾隨零,以下awk將刪除尾隨零

awk '{ if ($0 ~ /\./){ sub("0*$","",$0); sub ("\\.$","",$0);} print}' file

awk以上的輸出,

1.5
 0.006
 9.0001
 104.25
 17
 3.5

但是我想在小數點后添加一個零,即我想要的是一個浮點數,除了諸如2.0、3.0之類的值外,其余均不尾隨零

排除的輸出

1.5
 0.006
 9.0001
 104.25
 17.0
 3.5

可能使用sed

sed 's/0\+$//;s/\.$/.0/'

如果輸入中可能出現類似1200整數,請分別處理它們:

sed '/\./{s/0\+$//;s/\.$/.0/;b};s/$/.0/'

新版本處理更好的長號和文本

cat file
1.5000
0.006
 9.0001
 104.2500
17.0000
 3.5000
450.0005
test
my00000

awk '/^ *[0-9]+\.[0-9]+/{sub(/0+$/,"");sub(/\.$/,".0")}1' file
1.5
0.006
 9.0001
 104.25
17.0
 3.5
450.0005
test
my00000

這將所有前導0替換為空。 如果得到. 最后,將其替換為.0
它還測試是否以0或大於數字的空格開頭。

使用以下命令可獲得更准確的輸出,

檔名: sam

cat sam

45.0005
0.4440000
45.000000
66.66
44.000
.45000
45
 awk '{if($0 ~ /^[0-9]*\.[0-9]+/) { sub(/0+$/,"") sub(/\.$/,".0") sub(/^\./,"0.");} else if($0 ~ /^[0-9]+$/) {sub(/$/,".0");}}1' sam

輸出:

45.0005
0.444
45.0
66.66
44.0
0.45
45.0

在這種情況下,使用sed可能更簡單:

注意:

  • 以下將sed-E-r別名)結合使用,以支持擴展的正則表達式,這使命令更具可讀性。 它應該與GNU sed (Linux)和FreeBSD sed (OSX)一起使用。
  • 使用單個替換命令( s/.../.../ )。
  • 如果輸入中有整數,則保持不變。
sed -E 's/^( *[0-9]+\.[0-9]([0-9]*[1-9])?)0+$/\1/' file
  • 開頭的^和結尾的$確保整個輸入行都匹配
  • *匹配前導空格(如果有)
  • [0-9]+\\. 匹配小數點前的所有數字,加上小數點
  • [0-9]匹配第一個小數點后一位(一位數字)-這樣可以確保以.0結尾的數字不會被其尾隨的0剝奪
  • ([0-9]*[1-9])? 匹配任何其他數字,直到遇到非零數字(如果有)
  • 0+然后捕獲到行尾的尾隨零
  • 在替換字符串中, \\1表示第一個捕獲組( (...) ),除尾隨零外的所有內容-有效刪除它們。
  • 請注意,由於sed的默認行為,即輸出所有行(無論是否修改)的行都將完全通過沒有匹配數字(不需要修改的數字)的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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