簡體   English   中英

僅使用sed對齊數字

[英]Align numbers using only sed

我只需要使用sed命令將小數點與“,”符號對齊。 “,”應排在第5位。 例如:

183,7 

    2346,7 

        7,999 

應該變成:

  183,7 

 2346,7 

    7,999 

逗號前的最大數字為4。我嘗試使用此命令刪除空格:

sed 's/ //g' input.txt > nospaces.txt

然后我考慮根據逗號前的位數添加空格,但是我不知道如何僅使用sed來執行此操作。

任何幫助,將不勝感激。

如果您改變主意,這是awk解決方案

$ awk -F, 'NF{printf "%5d,%-d\n", $1,$2} !NF' file

  183,7

 2346,7

    7,999

將定界符設置為逗號並將兩個部分作為單獨的字段處理

試試這個:

gawk -F, '{ if($0=="") print ; else printf "%5d,%-d\n", $1, $2 }' input.txt

如果您使用的是GNU sed ,則可以執行以下操作

sed -r 's/([0-9]+),([0-9]+)/printf "%5s,%d" \1 \2/e' input.txt

假設每行只有一個數字; 有最多四位前,和那總有一個,

sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/    \1/;s/.*\(.....,.*\)/\1/;'

前一個s除去行中第一個數字以外的所有內容,並在其前面放置四個空格。 第二個刪除第五個字符之前之前的一切,留下剛夠空格右對齊的數量。

第二個s命令可能會破壞與第一個s命令不匹配的輸入行。 如果輸入中可能包含此類行,則可以添加條件分支,以避免在第一個替換失敗時執行第二個替換。 使用Gnu sed,這很簡單:

sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/    \1/;T;s/.*\(.....,.*\)/\1/;'

如果前一個s失敗,則T跳至命令末尾。 Posix standard sed僅在成功時有條件分支,因此您需要使用以下this回結構:

sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/    \1/;ta;b;:a;s/.*\(.....,.*\)/\1/;'

其中ta (成功轉移到a條件分支)用於跳過b (結束轉移到無條件的分支)。 :at命令引用的標簽。

暫無
暫無

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

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