csv 파일에서 값을 찾고 바꾸는 쉘 스크립트

csv 파일에서 값을 찾고 바꾸는 쉘 스크립트

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

관련 정보