2016-09-08 5 views
2

, wenn ich meine testing.sh Datei ausführenSortierung 3 Spalten und bekommen die durchschnittliche

#!/bin/bash 
FILE=$1 
COUNT=0 
while read -r SID FIRST LAST S1 S2 S3 
do 
    SUM=$(expr $S1 + $S2 + $S3) 
    AVG=$(expr $SUM/3) 
    printf '%d [%d] %s, %s\n' "$AVG" "$SID" "$LAST" "$FIRST" 
done < "$FILE" | sort -k 3,3n -k 4,4n -k 2,2g 

ich die folgenden Fehler.

expr: non-integer argument 

expr: syntax error 

Ich bin mir nicht sicher, was ich falsch mache. Ich habe auch versucht, echo, awk und bc, aber ich habe ähnliche Fehler für alle von ihnen.

ich führen Sie die Datei wie folgt aus:

/testing.sh /home/user/Desktop/sample.txt

Dies ist der Beispieltext.

123456789 Lee Johnson 72 85 90 
999999999 Jaime Smith 90 92 91 
888111818 JC Forney 100 81 97 
290010111 Terry Lee 100 99 100 
199144454 Tracey Camp 77 84 84 
299226663 Laney Camp 70 74 71 
434401929 Skyler Camp 78 81 82 
928441032 Jess Forester 85 80 82 
928441032 Chris Forester 97 94 89 

Wenn ich mein Programm ausführen, sollte dies der Ausgang sein:

71 [299226663] Camp, Laney 
80 [434401929] Camp, Skyler 
81 [199144454] Camp, Tracey 
93 [928441032] Forester, Chris 
82 [928441032] Forester, Jess 
92 [888111818] Forney, JC 
82 [123456789] Johnson, Lee 
99 [290010111] Lee, Terry 
91 [999999999] Smith, Jaime 
+0

fein hier mit Ihren Daten arbeiten. Können Sie $ S1, $ S2, $ S3 ausgeben? –

+0

@ Jean-FrançoisFabre, wenn ich sie selbst austeile, bekomme ich. ungültige Zahl 6: printf: 90 für die Zahlen in der letzten Spalte (die 90 ändert sich für die Werte jeder Zeile). – ellsusan

+2

Wenn Ihre Dateien die MS Windows-Umgebung durchlaufen haben, bestätigen Sie, dass sie '\ r \ n' Zeilenenden haben, indem Sie' cat -vet myScript.sh myData.txt' verwenden. Wenn Sie '^ M $' am Ende der Zeile sehen, haben Sie '\ r \ n' Zeilenenden. Verwende 'dos2unix myScript.sh myData.txt', um sie zu bereinigen. Viel Glück. – shellter

Antwort

4

Ihr S3 Wert tatsächlich nicht enthalten, wie 90, sondern enthält Werte wie 90$'\r', weil Sie Ihre Eingabedatei hat CRLF (DOS) anstelle von LF (UNIX) Newlines. Dies geschieht am häufigsten, wenn Sie Ihre Eingabedatei von einem Nicht-UNIX-System erhalten haben.

Befestigen Sie die Datei, Tools wie dos2unix oder vim Befehl :set fileformat=unix oder Code verwandt mit dem in Ihrem Skript folgend verwenden:

S3=${S3%$'\r'} # remove any trailing $'\r' from S3 
+0

danke! es funktionierte! – ellsusan

+1

Füge '* clairvoyant *' als einer von @Charles viele Talente hinzu. Way to lese zwischen den Zeilen (kein Wortspiel beabsichtigt): –

+0

@ DavidC.Rankin, danke, aber es ist spasisch und shelter, die zuerst zur Diagnose gekommen sind - ich habe gerade eine Antwort geschrieben, die es einkapselt. –

Verwandte Themen