awkが「スペース」を区切り文字として無視しないのはなぜですか?

awkが「スペース」を区切り文字として無視しないのはなぜですか?

私のスクリプトに問題があります。

全奏曲 まず、次の100行のファイルのリストがあります。

100;TEST ONE
101;TEST TWO
...
200;TEST HUNDRED

各行には2つのパラメータがあります。たとえば、最初の行のパラメータは「645」、「TEST ONE」です。したがって、セミコロンは区切り記号です。

2つの変数に2つのパラメータを含める必要があります。 $idと$nameだとしましょう。 $ idと$ nameの値は行ごとに異なります。たとえば、2行目の場合は、$ id = "646"と$ name = "TEST TWO"です。

その後、サンプルファイルをインポートして、事前定義されたキーワードを$ idと$ nameの値に変更する必要があります。サンプルファイルは次のとおりです。

xxx is yyy

だから私は異なる内容の100ファイルが欲しいです。各ファイルには、各行の$ idおよび$ nameデータを含める必要があります。そして$ nameの値に名前を付ける必要があります。

私のスクリプトがあります。

#!/bin/bash -x
rm -f output/*

for i in $(cat list)
    do

        id="$(printf "$i" | awk -F ';' '{print $1}')"
        name="$(printf "$i" | awk -F ';' '{print $2}')"

        cp sample.xml output/input.tmp

        sed -i -e "s/xxx/$id/g" output/input.tmp
        sed -i -e "s/yyy/$name/g" output/input.tmp

        mv output/input.tmp output/$name.xml


    done

だから私はリストファイルを一行ずつ読みました。各行に2つの変数をインポートし、それを使用してサンプルファイルのキーワード(xxxとyyy)を置き換え、結果を保存します。

しかし、何かが間違っています。

その結果、出力ファイルは1つだけです。そしてデバッグがひどいようです。

これはデバッグウィンドウです。私のリストファイルには2行しかありません。出力ファイルのみを取得します。ファイル名は「TEST」で、「101 is TEST」という文字列が含まれます。

「Test One」と「Test Two」の2つのファイルが必要です。「100はTest One」と「101はTest Two」を含める必要があります。

デバッグスクリーンショット

ご覧のとおり、2番目の変数(「TEST ONE」など)にスペースがあります。問題が空白の特殊記号に関連しているようですが、理由がわかりません。 -F awkパラメーターを ";"に設定したため、awkはセミコロンのみの区切り文字として解釈する必要があります。

私は何が間違っていましたか?

ベストアンサー1

私が正しく理解したら、whileループと変数拡張を使用できます。

while IFS= read -r line; do 
  id="${line%;*}"
  name="${line#*;}"
  cp sample.xml output/input.tmp
  sed -i -e "s/xxx/$id/g" output/input.tmp
  sed -i -e "s/yyy/$name/g" output/input.tmp
  mv output/input.tmp output/"$name".xml
done < file

@steeldriverが提案したように、ここに(よりエレガントな)オプションがあります:

while IFS=';' read -r id name; do 
  cp sample.xml output/input.tmp
  sed -i -e "s/xxx/$id/g" output/input.tmp
  sed -i -e "s/yyy/$name/g" output/input.tmp
  mv output/input.tmp output/"$name".xml
done < file

おすすめ記事