Script απορία

...IDE, compilers, κλπ

Συντονιστής: konnn

Script απορία

Δημοσίευσηαπό Fedil » 10 Μάιος 2012, 12:06

Γεια και χαρα.Θελω λιγο να μου δώσετε τα φώτα σας σχετικά με την δημιουργία script που διαβαζουν δεδομενα απο αλλα αρχεία και φτιάχνουν νεα. Εστω οτι εχω ενα αρχειο txt με 2 γραμμες αρθιμούς και τις τελευταιες γραμμες με λέξεις και συμβολα ας πουμε οτι η πρωτη σειρα γραχει Χ+Ε30 και στην ακριβως απο κατω γραμμη γραφει ενα αριθμο πχ 23. Εγω θελω λοιπον το script εκεινο να διαβασει το αρχειο Input.txt και να φτιαξει ενα αλλο αρχειο πχ output.txt οπου το αποτελεσμα στην πρώτη του γραμμη του output αρχειου θα ειναι το Χ+Ε30_23 και απο κατω 23_Χ+Ε30 η ακομα το αποτελεσμα να ειναι Χ+_23_Ε30.

Πως μπορει να γινει κατι τετοιο;
Debian 10 Buster 64bit
Intel Core i5 CPU M 430 2.27GHz ‖ RAM 3824 MiB ‖ Dell Inc. 0JY92C - Dell Inc. Inspiron 1564
ATI Manhattan [Mobility Radeon HD 5400 Series] [1002:68e0]
eth0: Realtek RTL8101E/RTL8102E PCI Express Fast Ethernet controller [10ec:8136] (rev 02) ⋮ eth2: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315] (rev 01)
Άβαταρ μέλους
Fedil
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 441
Εγγραφή: 06 Σεπ 2009, 16:32
Τοποθεσία: ΗΡΑΚΛΕΙΟ
Εκτύπωση

Re: Script απορία

Δημοσίευσηαπό parenthesis » 10 Μάιος 2012, 14:26

Αν κατάλαβα καλά, έχεις ένα αρχείο txt της μορφής :
X+E30
23
X+E87
5
....

Με αυτή τη μορφή αρχείου, το επόμενο bash script νομίζω θα κάνει τη δουλειά του :
Κώδικας: Επιλογή όλων
#!/bin/sh

if [ -z $1 ]; then
        echo "Usage: ./scriptaki <filename>"
        exit 1
elif [ -f "$1" ]; then
        fname="$1"
fi

output="output.txt"
i=0

while read a;
do

  i=$((i+1))
  if [ $((i % 2)) -eq 0 ]; then
    echo "$a" | sed 's/^/'$num'_/' >> "$output"
    echo "$a" | sed 's/$/_'$num'/' >> "$output"
  else
    num=$a
  fi

done < "$fname"
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
2 Dual boot:
  • Ubuntu 13.04 raring 3.8.0-34-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic
  • Fedora 19 Schrödinger’s Cat 3.13.5-101.fc19.x86_64 64bit (el_GR.utf8, gnome)
3 Intel Core i5-3337U CPU @ 1.80GHz ‖ RAM 3844 MiB ‖ TOSHIBA VCUAA - TOSHIBA SATELLITE U940
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 eth0: Realtek RTL8101E/RTL8102E Ethernet [10ec:8136] (rev 05) ⋮ wlan0: Intel Centrino Wireless-N 2230 [8086:0887] (rev c4)
Άβαταρ μέλους
parenthesis
punkTUX
punkTUX
 
Δημοσιεύσεις: 150
Εγγραφή: 06 Οκτ 2009, 22:47
Launchpad: mara_sdr
Εκτύπωση

Re: Script απορία

Δημοσίευσηαπό Fedil » 10 Μάιος 2012, 16:22

Πρεπει να μαθω bash scripting μου φαινεται και γρηγορα. Θα δανειστω ενα βιβλιο για να αρχισω να μαθαινω. Ευχαριστω πολυ για το παραδειγμα.
Debian 10 Buster 64bit
Intel Core i5 CPU M 430 2.27GHz ‖ RAM 3824 MiB ‖ Dell Inc. 0JY92C - Dell Inc. Inspiron 1564
ATI Manhattan [Mobility Radeon HD 5400 Series] [1002:68e0]
eth0: Realtek RTL8101E/RTL8102E PCI Express Fast Ethernet controller [10ec:8136] (rev 02) ⋮ eth2: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315] (rev 01)
Άβαταρ μέλους
Fedil
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 441
Εγγραφή: 06 Σεπ 2009, 16:32
Τοποθεσία: ΗΡΑΚΛΕΙΟ
Εκτύπωση

Re: Script απορία

Δημοσίευσηαπό Fedil » 18 Μάιος 2012, 21:59

Εχω μερικες απορίες.
Ο δείκτης i σε τι πραγμα τρεχει;
Το "if [ $((i % 2)) -eq 0 ]; then " τι δηλαδη αν ισουτε με 0;
Το a ειναι το ονομα του input αρχειου που λεγαμε;
To | sed τι ακριβως κανει;
Debian 10 Buster 64bit
Intel Core i5 CPU M 430 2.27GHz ‖ RAM 3824 MiB ‖ Dell Inc. 0JY92C - Dell Inc. Inspiron 1564
ATI Manhattan [Mobility Radeon HD 5400 Series] [1002:68e0]
eth0: Realtek RTL8101E/RTL8102E PCI Express Fast Ethernet controller [10ec:8136] (rev 02) ⋮ eth2: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315] (rev 01)
Άβαταρ μέλους
Fedil
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 441
Εγγραφή: 06 Σεπ 2009, 16:32
Τοποθεσία: ΗΡΑΚΛΕΙΟ
Εκτύπωση

Re: Script απορία

Δημοσίευσηαπό parenthesis » 18 Μάιος 2012, 22:36

Λοιπόν, ας τα πάρουμε από την αρχή.
Σε αυτό το κομμάτι :
Κώδικας: Επιλογή όλων
if [ -z $1 ]; then
        echo "Usage: ./scriptaki <filename>"
        exit 1
elif [ -f "$1" ]; then
        fname="$1"
fi

ελέγχουμε αν ο χρήστης έχει δώσει παράμετρο (δηλ. κάποιο input αρχείο) στο σκριπτ.
Αν όχι, τυπώνουμε κατάλληλο μήνυμα. Αν ναι, εκχωρούμε το όνομα του input αρχείου στη μεταβλητή $fname.

Εδώ :
Κώδικας: Επιλογή όλων
output="output.txt"
i=0

αρχικοποιούμε τις μεταβλητές $output και $i. Το $output ουσιαστικά περιέχει το όνομα του output αρχείου.
Η μεταβλητή $i χρησιμοποιείται στη λούπα που ακολουθεί για να μετράει τις γραμμές του αρχείου εισόδου.

Στην παρακάτω λούπα :
Κώδικας: Επιλογή όλων
while read a;
do

...

done < "$fname"

διαβάζουμε το αρχείο που έχει δώσει ο χρήστης γραμμή-γραμμή.
Με το < "$fname" δίνουμε στο while το αρχείο εισόδου (http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#s3).
Στη μεταβλητή $a εκχωρείται κάθε φορά η γραμμή που διαβάζουμε.

Στο παρακάτω κομμάτι γίνεται όλη η δουλειά :
Κώδικας: Επιλογή όλων
if [ $((i % 2)) -eq 0 ]; then
   echo "$a" | sed 's/^/'$num'_/' >> "$output"
   echo "$a" | sed 's/$/_'$num'/' >> "$output"
else
   num=$a
fi 

Εδώ συμβαίνει το εξής : Όταν διαβάζω περιττή γραμμή (1, 3, 5, ...) τότε αποθηκεύω τη γραμμή αυτή στη μεταβλητή $num (κομμάτι else).
Διαφορετικά, αν είναι άρτια η γραμμή (2, 4, 6, ...), τυπώνω στο αρχείο εξόδου τα μοτίβα : $num_$a και $a_$num (κομμάτι if...).
Στο if [ $((i % 2)) -eq 0 ]; then ... ελέγχουμε αν το ($i MOD 2) είναι ίσο με 0, δηλαδή αν διάβασα άρτια γραμμή.

Για το sed διάβασε περισσότερα εδώ -> http://www.grymoire.com/Unix/Sed.html
Για το | (pipe) δες εδώ -> http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#s4
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
2 Dual boot:
  • Ubuntu 13.04 raring 3.8.0-34-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic
  • Fedora 19 Schrödinger’s Cat 3.13.5-101.fc19.x86_64 64bit (el_GR.utf8, gnome)
3 Intel Core i5-3337U CPU @ 1.80GHz ‖ RAM 3844 MiB ‖ TOSHIBA VCUAA - TOSHIBA SATELLITE U940
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 eth0: Realtek RTL8101E/RTL8102E Ethernet [10ec:8136] (rev 05) ⋮ wlan0: Intel Centrino Wireless-N 2230 [8086:0887] (rev c4)
Άβαταρ μέλους
parenthesis
punkTUX
punkTUX
 
Δημοσιεύσεις: 150
Εγγραφή: 06 Οκτ 2009, 22:47
Launchpad: mara_sdr
Εκτύπωση

Re: Script απορία

Δημοσίευσηαπό Fedil » 20 Μάιος 2012, 13:49

Ευχαριστω που ειχες την υπομονη και τα εξηγησες! :)
Debian 10 Buster 64bit
Intel Core i5 CPU M 430 2.27GHz ‖ RAM 3824 MiB ‖ Dell Inc. 0JY92C - Dell Inc. Inspiron 1564
ATI Manhattan [Mobility Radeon HD 5400 Series] [1002:68e0]
eth0: Realtek RTL8101E/RTL8102E PCI Express Fast Ethernet controller [10ec:8136] (rev 02) ⋮ eth2: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315] (rev 01)
Άβαταρ μέλους
Fedil
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 441
Εγγραφή: 06 Σεπ 2009, 16:32
Τοποθεσία: ΗΡΑΚΛΕΙΟ
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού

cron