後でファイルの値を変更してください。

後でファイルの値を変更してください。

名前、生年月日、贈り物を含むデータベースなどのファイルがあります。日付はファイル内の1行に1つずつタブで区切られます。たとえば、次のようになります。

name1  surname1  dateofbirth1  gift1
name2  surname2  dateofbirth2  gift2

ギフト列に「はい」または「いいえ」を保存すると、私のコードは次のようになります。

while IFS=$'\t' read -r name surname dob gift; do
    if [[ "$gift" == "No" ]]; then
        echo "Congrats, here is your gift
        gift=Yes
    fi
done < "file.txt"

ところでプレゼント欄は変わりがなく、補助変数としてのみ存在するようです。その列の対応する行値をyesにどのように変更しますか?

ベストアンサー1

ファイルから値を読み取り、その値を保持する変数を変更しても、ファイルの値は変更されません。

代わりに、どの値を変更するかを検出して変更し、ファイル全体(変更された値を含む)を新しいファイルに出力する必要があります。その後、この新しいファイルを元の名前に移動して古いファイルを置き換えることができます。

また、シェルでテキストを解析することは一般的に避けるために。代わりに、次のようなものを試してくださいawk

awk -F '\t' 'BEGIN { OFS=FS }
             $4 == "No" { print "Congrats, here is your gift" >"/dev/stderr" }
             { $4 = "Yes"; print }' file.txt >newfile.txt

その後、ファイルを1行ずつ読み、4列目が表示されるたびにNoテキストを出力しますCongrats, here is your gift

Yesその後、各行に対して行全体を印刷する前に、無条件に4番目の列がに設定されます。

上記のプログラムを作成して実行すると、Congrats...メッセージが端末に表示され(標準エラーストリームに書き込まれ)、ファイルの更新内容が名前付きファイルに書き込まれますnewfile.txt

BEGINコードの先頭のブロックは、単に出力フィールド区切り文字をコマンドラインのタブに設定されているOFS入力フィールド区切り文字と同じ値に設定します。FS-F '\t'

おすすめ記事