Λοιπόν, ας τα πάρουμε από την αρχή.
Σε αυτό το κομμάτι :
- Κώδικας: Επιλογή όλων
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)