עבור לתוכן

שאלה ב- UNIX - לולאת FOR

Featured Replies

פורסם

אני צריך לקלוט מחרוזת של 3 קבצים לדוגמה:

F1 F2 F3

כל אחד מכיל מספר שורות, צריך לחבר את הסכום של מספר השורות של הקבצים.

מה שעשיתי עד עכשיו זה ככה:



read x
echo $x >|temp
for x in $(cat temp)
do
wc -l < $x
done >| temp2






[code/]


עכשיו קובץ temp2 מכיל רשימה של מספר שורות בכל קובץ ככה:
12
14
10


למישהו יש רעיון איך אני מחבר את המספרים ומציג על המסך את התוצאה?


תודה.

פורסם

מתמטיקה בקונסול מתבצעת אל ידיי let למשל כך :

let x = $y+$z

כך שאם יש לך את המספרים ב 1 מה tempים אתה יכול לעשות let

אבל יש דרך יותר פשוטה : אם אה משתמש אם לולאה כדיי לספור שורות (cat) אז פשוט תמשיך אם אותו משתנה לקבצים הבאים ואל תאפס אותו כל הזמן

פורסם
  • מחבר

תודה על המידע, עשיתי את זה בדרך הבאה:



read x
echo $x >|temp
for x in $(cat temp)
do
wc -l < $x
done >| temp2


y=0
for x in $(cat temp2)
do
y=$[$y+$x]
done
echo $y
rm temp temp2

עכשיו אני צריך עזרה בשאלה נוספת:

יש לי קובץ שמכיל את המספרים הבאים:

2 8 3 7

100

40 20 3

60 70

אני צריך להשתמש בלולאות for while בכדי לחבר כל שורה כך שהפלט יהיה כך:

20

100

63

130

נסיתי כל מיני אפשרויות אבל לא הצלחתי...יש טיפים ?

פורסם

מותר לך להשתמש בwc בתרגיל או שאתה חייב לממש רק עם sh?

מה עם bash extensions?

פורסם
  • מחבר

כן אין בעיה להשתמש ב- WC CUT כל הדברים הבסיסיים...

פורסם

פתרון ללא wc או cut. אני לא נותן את הפתרון אלא הדגמה, תעבור עליה :

יש כאן את כל הפקודות שתצתרך כדיי לפתור את הבעיה

[ash@viridian ~]$ echo 7 3 8 2'
'100'
'3 20 40'
'70 60 |cat >infile

[ash@viridian ~]$ cat infile
7 3 8 2
100
3 20 40
70 60

[ash@viridian ~]$ for i in `cat infile` ; do echo x$i ; done
x7
x3
x8
x2
x100
x3
x20
x40
x70
x60

[ash@viridian ~]$ echo every challenge along the way
every challenge along the way

[ash@viridian ~]$ echo every challenge along the way |sed -e 's/ /_/g'
every_challenge_along_the_way

[ash@viridian ~]$ echo every challenge along the way |sed -e 's/challenge/adventure/g'
every adventure along the way

[ash@viridian ~]$ for i in `cat infile |sed -e 's/ /_/g'` ; do echo x$i ; done
x7_3_8_2
x100
x3_20_40
x70_60

[ash@viridian ~]$ let sum=0
[ash@viridian ~]$ for i in `cat infile` ; do let sum=$sum+$i ; done
[ash@viridian ~]$ echo $sum
313

פורסם
  • מחבר

תודה על ההדגמה רק שיש פה הרבה פקודות שלא למדתי עדיין וכנראה נדרש ממני לעשות את זה בדרך מסובכת יותר,

לא מכיר את let sed וצורת כתיבת הלולאה...

פורסם

רוצה את הפתרון לפי הפקודות האלה ? או שלב נוסף בדרך לפתרון ?

פורסם
  • מחבר

את תחילת הדרך, איך אני לוקח כל מספר בשורה מחבר אותו עם השני ונותן תוצאה...

אני ארשום את זה אחר כך בהתאם לתרגיל

פורסם

הבעיה ההתחלתית היא ש for מקבל כל מספר בפני עצמו, בלי התייחסות לשורות. על ידיי sed ניתן לאחד כל שורה ל string שנראה כמו

7_3_8_2

ועכשו נניח שהרצנו forעל ה string-ים האלה


[ash@viridian ~]$ echo 7_3_8_2 |cat >infile

[ash@viridian ~]$ cat infile
7_3_8_2

[ash@viridian ~]$ for i in `cat infile` ; do echo x$i ; done
x7_3_8_2

[ash@viridian ~]$ for i in `cat infile |sed -e 's/_/ /g'` ; do echo x$i ; done
x7
x3
x8
x2

[ash@viridian ~]$ let s=0
[ash@viridian ~]$ for i in `cat infile |sed -e 's/_/ /g'` ; do let s=$s+$i ; done
[ash@viridian ~]$ echo $s
20

פורסם
  • מחבר

עשיתי את זה וזה לא עבד כמו שצריך...





for i in `cat F6`
do
echo x$i
done
for i in `cat F6 |sed -e 's/_/ /g'`
do
echo x$i
done
let s=0
for i in `cat F6 |sed -e 's/_/ /g'`
do
let s=$s+$i
done
echo $s

הפלט חייב להיות בדיוק ככה:

20

100

63

130

זה מה שיוצא לי:

F6

x2

x8

x3

x7

x100

x40

x20

x3

x60

x70

x2

x8

x3

x7

x100

x40

x20

x3

x60

x70

313

פורסם

הבאתי הדגמה, לא את התשובה. שים לב שבהדגמה השניה התוכן של infile היה

7_3_8_2

אתה צריך לולאת for חיצונית (שתכלול את הלולאה שיש) כדיי לעבור על כל שורה בקובץ

פורסם
  • מחבר

הבעיה שיש פה פקודות שאני לא מכיר... אז קשה לי להבין מה בדיוק כל שורה עושה...

פורסם
  • מחבר

עכשיו מישהו שלח לי את הדרך:

וזה מה שמבקשים מאיתנו לעשות...


read file
tr -s " " < $file >| temp
echo -n "" >| temp2
while read x
do
b=0
for a in $x
do
b=$[$b+$a]
done
echo $b >> temp2
done < temp
cat temp2
rm temp temp2

פורסם

הפקודה sed מאפשרת לעבד טקסט בשורת הפקודה. במקרה הזה אני משתמש איתה כדיי לבצע search and replace

[ash@viridian ~]$ echo every challenge along the way
every challenge along the way

[ash@viridian ~]$ echo every challenge along the way |sed -e 's/challenge/adventure/g'
every adventure along the way

הפקודה let משמשת להגדרת משתנים ופעולות מתמטיות

[ash@viridian ~]$ let s=0

[ash@viridian ~]$ echo $s
0

[ash@viridian ~]$ let s=$s+6

[ash@viridian ~]$ echo $s
6

[ash@viridian ~]$ let s=$s+3

[ash@viridian ~]$ echo $s
9

[ash@viridian ~]$ let x=4

[ash@viridian ~]$ let y=$s-$x

[ash@viridian ~]$ echo $y
5

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים