ループを使用して特定の行の後に行を挿入する

ループを使用して特定の行の後に行を挿入する

次のようなテキストファイルがあります。

   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^^}変数を大文字にします。

関連情報