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'}