
次のようなテキストファイルがあります。
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^^}
変数を大文字にします。