名前、生年月日、贈り物を含むデータベースなどのファイルがあります。日付はファイル内の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'