עבור לתוכן

עזרה | bash scripting

Featured Replies

פורסם

שלום לכולם , יש לי קובץ csv שמסודר בצורה כללית לפי עמודות שמופרדות עם פסיקים לדוגמא:

name,id,phone

sigi,555,76575

fil,7654,765

gil,7654,7685

(לקובץ שלי קוראים sqlBash.sh)

הרעיון הוא שאני אוכל להוסיף להציג ולערוך

בשביל זה אני צריך רעיון לניתוב לתוך השורה הרצויה (או מספר שורות) לדוגמא אם אני ירשום :

"sqlBash.sh select from "book.csv" where "id=x/

יוצג לי כל השורות שמופיע בהם ID = X

כנל גם למחיקה (צריך לתמוך ב: =,<,>)

התחלתי להשתמש ב grep אבל אני לא יודע איך לנתב את עצמי לפי השדות הרצויים

אני רק יודע איך להציג את השורות שבהן מופיע השם,טלפון או הת.ז

אבל זה רק בגלל ש grep עושה חיפוש כללי ומציג לי אותם.

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

את ההצגה שלו אני כנראה יעשה ב cat

ישמח להצעות :nixweiss:

פורסם

אתה חייב ממשק SQL? אם כן הדרך ההגיונית היחידה היא לייבא את הCSV לSQLLITE ולהמשיך משם.

אם לא תראה אם SED מספיק לצרכיך, ובשלב הבא או AWK או PERL

פורסם

מה התוכן של ה shell scipt שאתה מתמש בו?

לבצע parsing מתוך CSV זה מאוד שיטתתי.

פורסם
  • מחבר

אני לא רוצה ממשק SQL

באופן כללי אני בודק את התוים שהגיעו מהמשתמש ע"י $ כאשר כל תו מנותב לפונקציה אחרת

זה מאוד שיטתי אבל גם לא הכי מסובך

בכללי אני צריך לחפש את הערך עפ"י המיקום הספציפי :hat:

פורסם

אני אוהב BASH אך אין כמו PERL בשביל פעולות כאלו.

יצרתי קובץ בשם pr.txt עם הנתונים כפי שרשמת בהודעה שלך.

אפשר להריץ את הסקריפט, למשל:

./pr.pl id

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

אני בטוח שאפשר לעשות זאת ב BASH אך מפני שאני מכיר PERL זה נראה כמו עבודה מסורבלת ל BASH.

#!/usr/bin/perl -w
use strict;
die "no arguments supplied" unless @ARGV; # נבדוק אם סיפקנו ערך לחפש בהרצת התוכנה, אחרת נסיים

# נזרוק כל שורה של הקובץ לתוך מערך
open (SFILE, "pr.txt") || die "Error opening file: $! \n";
my @lines = <SFILE>;
close SFILE;

my $temp;
my @vals;
my @header = split (/,/, $lines[0]); # נזרוק לתוך מערך את השורה הראשונה - ה"קטגוריות" - נשבור את השורה: כל ערך מופרד ע"י פסיק
for my $i (0..$#header){ # נריץ לופ על המערך החדש, בכל פעם אנחנו עוברים ערך ("קטגוריה") מתוך השורה
chomp ($header[$i]); # ניקיון
if ($header[$i] eq $ARGV[0]){ # אם הערך שאנחנו עוברים כרגע שווה לערך שסופק בהרצת התוכנה,
$temp = $i; # capture the colum's number into $temp # נלכוד את הערך של העמודה לתוך משתנה חדש
print $header[$temp] . "\n"; # נדפיס לפלט את הערך שמצאנו
}
}

for my $i (1..$#lines){ # לופ חדש, מתחיל ב 1, כי 0 היה בשביל השורה של ה"קטגוריות"
@vals = split (/,/, $lines[$i]); # נזרוק לתוך מערך את הערכים ע"פ הפרדה של פסיק
for my $j (0..$#vals){ # נריץ לופ על המערך החדש
chomp ($vals[$j]); # ניקיון
if ($j == $temp){ ## כאן אני משווה את הערך שלכדנו מקודם לעמודה שאנחנו בודקים בלופ הזה, אם יש התאמה, נדפיס לפלט
print $vals[$j];
}
}
print "\n"; # שורה חדשה
}

פורסם

אם הולכים על PERL תמצא בCPAN מודולים שניתן לעשות בעזרתם הרבה. חפש TEXT::CSV

פורסם
  • מחבר

תודה על ההודעה המושקעת אני מעריך את זה :)

התחלתי עם זה בבאש עכשיו

איך אני יכול לקחת מחרוזת ולפרק אותה לשלושה מחרוזת לפי הצרכים שלי

לדוגמא : name=gil

אני רוצה את סוג האופרטור את העמודה המבוקשת ואת השם הרצוי

זה הצעד הבא ידידי :xyxthumbs:

פורסם

cut

ארכיון

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

דיונים חדשים