2014-09-24 2 views
0

저는 이곳에서 새로 왔으며 프로그래밍에 초보적인 분들이기 때문에 조심해서 제게 알려주십시오.bash 스크립트에서 awk로 파일의 데이터를 추출하고 저장하십시오.

Filename = Datafile.tmp 

나는 내가 shomething을 설명해야이 같은 데이터의 1 개 라인 (쉼표로 구분)

24092014,17:21,357.7,5.1,49.96,228.6,7.9,1757.5,3378200.0,28.2,20680.0,846.0,1800.0,2  

Maby와 로그 파일을 얻을. BASH에서 작성한 스크립트로 내부 루틴을 통해 인버터의 데이터를 읽습니다. 위의 데이터 파일에서 데이터를 읽을 수 있도록 해당 스크립트를 변경하고 싶습니다. 스크립트는 verry long이지만 읽기 부분 만 있습니다. 그래서 난 모든 읽기 포트 루틴을 델 수 있고 그냥에 집중할 수 있다고 생각합니다

내 경우에는 파일에서 읽을 수있는 데이터로 배열에서 데이터를 변환합니다. 변수를 저장 bottum에서 작업 파일

#Ask data from inverter 
get_data() { 
printf $GetDataCMD > $PORT 
dd if=$PORT of=$OUT bs=1 count=$dataLengthTotal & 
PID=$! 
sleep 3 
if [ -d /proc/$PID ] 
then 
    rcvd="no" 
    kill $PID 
else 
    rcvd="yes" 
fi 
} 

#Put received data in array and check for errors 
receive_data() { 
((dataLengthTotal = $ANS_OFFSET+$dataLengthOutput+1)) 
retry_counter=$RETRY 
while ((retry_counter)); do 
get_data < $PORT 2>/dev/null 
if [ $rcvd = "yes" ]; then 

    data=(`od -b -v $OUT | sed -e 's/^[0-9]*//g' | sed -e 's/[ ]\([0-9]\)/ 0\1/g'`) 

    if [ ${#data[@]} -ne $dataLengthTotal ]; then 
    rcvd="nochk" 
    echo -e `date -R`": Wrong amount of data received\r" >> $LOG 
    init_comport 
    ((retry_counter -= 1)) 
    else 
    # Check CRC 
    sumstr="${data[@]:$ANS_OFFSET:$dataLengthOutput}" 
    let sum=${sumstr// /+} 
    if ((sum%256 == data[9+$dataLengthOutput])); then 
     rcvd="chk" 
     retry_counter=0 
    else 
     rcvd="nochk" 
     echo -e `date -R`": Checksum error in received data\r" >> $LOG 
     init_comport 
     ((retry_counter -= 1)) 
    fi 
    fi 
else 
    init_comport 
    ((retry_counter -= 1)) 
fi 
done 
} 

#convert data from array into readable data 
get_current_data() { 
dataLengthOutput=30 
GetDataCMD=$GetCurrentDataCMD 
receive_data 
if [ $rcvd = "chk" ]; then 
#errorbits 
((errbits = data[9+7] * 256 + data[9+6])) 
#Voltage Solarpanels (Usol) 
((Usol = data[9+9] * 256 + data[9+8])) 
#Current Solarpanels (Isol) 
((Isol = data[9+11] * 256 + data[9+10])) 
#AC Frequency (Fnet) 
((Fnet = data[9+13] * 256 + data[9+12])) 
#AC Voltage (Unet) 
((Unet = data[9+15] * 256 + data[9+14])) 
#AC Current (Inet) 
((Inet = data[9+17] * 256 + data[9+16])) 
#AC Power (Pnet) 
((Pnet = data[9+19] * 256 + data[9+18])) 
#Total delivered (Etot) 
((Etot = data[9+22] * 65536 + data[9+21] * 256 + data[9+20] + WtotOffset)) 
#Temp Inverter (Tinv) 
((Tinv = data[9+23])) 
#Total runtime (Htot) 
((Htot = data[9+26] * 65536 + data[9+25] * 256 + data[9+24] + HtotOffset)) 
#Total CO2 (Ctot) 
((Ctot = Etot * $CO2perc/100)) 
fi 
} 

#check, convert and write error messages 
convert_errorbits() { 
ErrorStr="Systeem_OK" 
if ((errbits)); then 
if ((errbits & 0x01)); then 
    ErrorStr="Usolar too high (`print_float $Usol 1` V). ${ErrorStr}" 
fi 
if ((errbits & 0x02)); then 
    ErrorStr="Usolar too low (`print_float $Usol 1` V). ${ErrorStr}" 
fi 
if ((errbits & 0x04)); then 
    ErrorStr="No mains detected. ${ErrorStr}" 
fi 
if ((errbits & 0x08)); then 
    ErrorStr="Uac too high (${Unet} V). ${ErrorStr}" 
fi 
if ((errbits & 0x10)); then 
    ErrorStr="Uac too low (${Unet} V). ${ErrorStr}" 
fi 
if ((errbits & 0x20)); then 
    ErrorStr="FreqAC too high (`print_float $Fnet 2` Hz). ${ErrorStr}" 
fi 
if ((errbits & 0x40)); then 
    ErrorStr="FreqAC too low (`print_float $Fnet 2` Hz). ${ErrorStr}" 
fi 
if ((errbits & 0x80)); then 
    ErrorStr="Temperature error (${Tinv}ºC). ${ErrorStr}" 
fi 
if ((errbits & 0x100)); then 
    ErrorStr="Hardware error. ${ErrorStr}" 
fi 
if ((errbits & 0x200)); then 
    ErrorStr="Starting. ${ErrorStr}" 
fi 
if ((errbits & 0x400)); then 
    ErrorStr="Max output (${Pnet} W). ${ErrorStr}" 
fi 
if ((errbits & 0x800)); then 
    ErrorStr="I max (`print_float $Isol 2` A). ${ErrorStr}" 
fi 
echo -e `date -R`": Error message: $ErrorStr\r" >> $LOG 
fi 
} 

#Get current day output 
get_current_day() { 
dataLengthOutput=8 
((daynr = 0)) 
((crc = $GetDailyDataCRC+$daynr)) 
GetDataCMD=$GetDailyDataCMD1\\x`printf "%02X" $1 $daynr`$GetDailyDataCMD2\\x`printf "%02X" $1 $crc` 
receive_data 
if [ $rcvd = "chk" ]; then 
# Profit [kWH] 
((Etoday = data[9+7] * 256 + data[9+6])) 
# Runtime [h:mm] 
((Htoday = data[9+5] * 5)) 
# CO2 
((CO2 = Etoday * $CO2perc/100)) 
fi 
} 



# Main Program 
main(){ 
#set time variables 
MTIME=`date +%M` 
HTIME=`date +%H` 

# Configure serial port 
init_comport 

#Store file contains data needed for calculating totals etc 
#Internally an array is used, values are: 
#0=Active flag 
#1=WtotAct 
#2=HtotAct 
#3=WtotLog 
#4=HtotLog 
#fill array 
store=(`cat $STORE`) 

get_current_data 

if [ $rcvd = "chk" ]; then 
if ((! store[0])); then 
    echo -e `date -R`": Waking up; Inverter started.\r" >> $LOG 
    store[0]=1 
    if ((USE_30DAYS)); then 
    get_last_30_days 
    fi 
    if [ ! -f $PVDIARYCSV ] 
    then 
    create_pvdiary 
    fi 
    if ((USE_EMAIL)) && ((USE_EMAwake)); then 
    email_send "Bericht van uw zonnepanelen : ontwaken." "I'm awake now !\n\nUw Mastervolt Omvormer\n" 
    fi 
fi 

# Remember 'old-values' for calculating PVDiary inputs 
((store[5] = store[1])) 
((store[6] = 0)) 

# Put total values into array for calculating daily profit 
store[1]=$Etot 
store[2]=$Htot 

convert_errorbits 
get_current_day 
create_actual_page 
rrd_update 
fill_pvdiary 
fill_sql 
pvoutput_live_update 
fi 

#Write message before sleep 
if [ $rcvd = "no" ] && ((! retry_counter)) && ((store[0])); then 
echo -e `date -R`": No reaction from Inverter; entering sleep\r" >> $LOG 
create_offline_page 
store[0]=0 
fi 

#Write 0-values in PVDiary-file 
if [ $rcvd = "no" ] && ((! retry_counter)) ; then 
((store[5] = store[1])) 
((store[6] = 0)) 
fill_pvdiary 
((store[5] = store[1])) 
((store[6] = 0)) 
fill_sql  
((store[5] = 0)) 
fi 

#Run timebased scripts (internal cron) 
if [ $HTIME = 23 ] && [ $MTIME = 00 ]; then 
fill_csv 
fi 
if [ $MTIME = 00 ] && ((USE_RRD)); then 
graph 
fi 
if [ $MTIME = 00 ] && ((store[0])) && ((USE_EMAIL)) && ((USE_EMAhour)); then 
email_send_actual "Bericht van uw zonnepanelen : productie tot nu toe." 
fi 

#storing variables to working file 
echo ${store[0]} ${store[1]} ${store[2]} ${store[3]} ${store[4]} ${store[5]}${store[6]}> $STORE 
} 

#What to do ? 
case $1 in 
"help" ) help;; 
"create") create;; 
"draw" ) graph;; 
*  ) main;; 
esac 

답변

1
$ awk -F, '{print "Today = " $1 "\nTime = " $2 "\nHertz = " $5}' file 
Today = 24092014 
Time = 17:21 
Hertz = 49.96 
+0

감사 이것을이 이해합니다. print 명령을 사용하여 이름을 지정하고 파일 등의 첫 번째 문자를 가져옵니다. 변수 나 문자열에 직접 입력 할 수 있습니까? $ Today와 $ Time etc와 같이 bash 스크립트를 통해 모든 것을 배울 수 있습니까? –

+0

네,하지만 그건 틀림없이 틀린 접근 일 것입니다. 파일과 프로세스를 조작하지 않는 한 올바른 방법은 전체 스크립트를 awk에 작성하는 것입니다. 샘플 입력과 예상 출력에 대한 더 큰 문제를 설명하는 새로운 질문을 게시하여 도움을 받으십시오. –

+0

내 스크립트가 변경되었습니다. 제안이 있습니까? –

관련 문제