使用循環在特定行之後插入行

使用循環在特定行之後插入行

我有一個文字檔如下;

   SITE              FIX    --COORD.CONSTR.--  
      << default for regional stations >>
ALL               NNN    100.  100.   100.     
      << IGS core stations >>
VILL VILL_GPS     NNN    0.050 0.050  0.05
MAS1 MAS1_GPS     NNN    0.050 0.050  0.05

首先,我使用此命令刪除“<< IGS core station >>”之後的所有預設行;

sed -i '/GPS/d' ./text.data

然後我需要添加用戶輸入的 4 個字元 id,其格式如上;

echo -n "###ids?####" 
read ids

假設用戶輸入brmu ista ankr。那麼text.data檔案需要如下;

SITE              FIX    --COORD.CONSTR.--  
      << default for regional stations >>
ALL               NNN    100.  100.   100.     
      << IGS core stations >>
BRMU BRMU_GPS     NNN    0.050 0.050  0.05
ISTA ISTA_GPS     NNN    0.050 0.050  0.05
ANKR ANKR_GPS     NNN    0.050 0.050  0.05

如何將這些帶有循環的輸入插入到具有上述特定格式的文字檔案中?

答案1

我會使用 awk:

read ids
# some validation here...

awk -v input="$ids" '
    BEGIN {
        n = split(toupper(input), user)
        fmt = "%-4s %-8s     NNN    0.050 0.050  0.05\n"
    }
    {print}
    /<< IGS core stations >>/ {
        for (i=1; i<=n; i++)
            printf fmt, user[i], user[i]"_GPS"
        exit
    }
' ./text.data

輸出

   SITE              FIX    --COORD.CONSTR.--  
      << default for regional stations >>
ALL               NNN    100.  100.   100.     
      << IGS core stations >>
BRMU BRMU_GPS     NNN    0.050 0.050  0.05
ISTA ISTA_GPS     NNN    0.050 0.050  0.05
ANKR ANKR_GPS     NNN    0.050 0.050  0.05

答案2

你可以這樣做:

sed -i '/GPS/d' text.data; read -p "###ids?####" ids; for i in $ids; do 
        printf '%s\t%s_GPS\tNNN\t0.050\t0.050\t0.05\n' "${i^^}" "${i^^}"
    done >> text.data

這將循環遍歷每個單字$ids並用於printf以所需的格式列印它。使${i^^}變數大寫。

相關內容