csvファイルからセル値を取得し、同じ行の対応するセルを置き換えるシェルスクリプトを作成しようとしています。
以下は私のCSVファイルです(report.csv
)
#、デバイスステータス
1.機器1、中古
2.機器2、無料
3.機器3、無料
これが私がしたいことです:
ユーザーはスクリプトの実行時にデバイス名を入力として入力します。
たとえば、デバイス名を入力するには、
ユーザーは「Device2」と入力します。
次のステップ:スクリプトは検索する必要があります。デバイス2存在するreport.csv
。見つかったらデバイス2、小切手の値状態値が次の場合、対応する列無料、次に置き換え使用される、そうでなければスクリプトを終了します。デバイス 2 はすでに使用中です。。
私は次のコードを試しました
#!/bin/bash
dvc=""
FILE_HOME="/tmp/test/"
update_value () {
awk -F, -v d="$dvc" '$2==d{if($3=="Free")$3="Used"; else print d "In use"; input_value;}1' \
OFS=, "$FILE_HOME"/report.csv > "$FILE_HOME"/report1.csv
mv "$FILE_HOME"/report1.csv "$FILE_HOME"/report.csv
}
input_value () {
echo -e "Enter the device name:\n"
read dvc
update_value
}
input_value
このコードは、次のような場合には大丈夫です。もし声明は本物。
しかし、時もし声明は間違ったinput_value
、else部分で関数を呼び出しません。ただ印刷される端末番号が使用中ですcsvファイルの他のエントリと一緒に新しいファイルに追加します。
次の出力ファイルを取得します。
入力デバイス2:
#、デバイスステータス
1. デバイス 1、使用済み
2、デバイス 2、使用済み
3、デバイス 3、アイドル入力デバイス1:
#、デバイスステータス
デバイス1使用中
1、デバイス1、使用
2、デバイス2、アイドル
3、デバイス3、アイドル
これが私がする正しい方法ですか?
要件を達成する他の/より良い方法があるかどうかを知りたいです。
答え1
エラーメッセージをに記入してくださいstderr
。
awk -F, OFS=, -v d="$dvc" '
$2==d {
if($3=="Free") $3="Used"
else print d "In use" > "/dev/stderr"
print
}' $FILE_HOME/report.csv > $FILE_HOME/report1.csv
stderr
これにより、標準出力ではなく画面(リダイレクトされていない場合)に表示されます。
つまり、スクリプトを使いやすくするためにできることがいくつかあります。これはどうですか:
#!/usr/bin/awk -f
BEGIN {
FS=","
OFS=","
FILE_NAME="/tmp/test/report1.csv"
print "Enter the device name:"
getline d < "-"
}
$2==d && $3=="Free" {
$3="Used"
print > FILE_NAME
next
}
$2==d {
print d " in use" > "/dev/stderr"
}
{
print > FILE_NAME
}
呼ぶ
$ script_name /tmp/test/report.csv
および/またはbash
必要に応じて梱包します。
答え2
シェルとawkに限定されていますか? SQLiteを使用してデータを保存したり、少なくとも解析できますか?
sqlite> .mode csv
sqlite> .import report.csv report
sqlite> update report set status="Used" where Device="Device2";
sqlite> select * from report;
1,Device1,Used
2,Device2,Used
3,Device3,Free
それともPythonのようなより一般的なプログラミング言語を使って作業を実行できますか?
import csv
with open('report.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
if row['Device'] == "Device3":
row['Status'] = "Used"
print row
{'Device': 'Device1', 'Status': 'Used', '#': '1'}
{'Device': 'Device2', 'Status': 'Free', '#': '2'}
{'Device': 'Device3', 'Status': 'Used', '#': '3'}