Δημοσιεύτηκε: 18 Μάιος 2012, 22:36
από parenthesis
Λοιπόν, ας τα πάρουμε από την αρχή.
Σε αυτό το κομμάτι :
Κώδικας: Επιλογή όλων
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