2011-10-10 20 views
0

UNIXシェルスクリプト、特にファイルの読み込みにいくつか問題があります。私が最終製品を望むのは、スクリプトがテキストファイルをコマンドライン引数として取り、さまざまな操作で使用する特定の部分を抽出することです。テキストファイルは次のようになります。UNIXのテキストファイルから特定のテキストを抽出する

ABC12345:John Smith:78 
DEF12345:Jane Doe:80 
GHI12345:Bob Johnson:91 

このようなテキストファイルは、他のいくつかの行でも同様です。今、私は最後のコロンは、このコードスニペットでは、ここで後に番号を抽出するために、これまで何をした:

case $1 in 

    m)cat $2 | while read -r file; do 
    #gets the numbers from 0 to 100 
    current=grep [0-100] 

case文は、エンドユーザがプログラムの異なった方法を実行することができますという理由だけです。ただし、コードセグメントの主なアイデアは、テキストファイルの行の最後に2桁の番号を取り、それを現在の変数に格納することです。

残りの操作は本当にこのアイディアを中心にしていますが、途中で名前を抽出する方法は完全にはわかりません。

とにかく、どんな助けも素晴らしいでしょう!ちょうど私がこれに非常に新しいことを覚えておいてください。

+4

awkやcutを見てください。列を印刷することができます。真ん中で名前を取得するには、cut -dという簡単な方法があります:-f2 – frankc

+0

[bashの区切り文字に基づいて文字列を分割しますか?](http://stackoverflow.com/questions/918886/split-string -based-on-delimiter-in-bash) –

答えて

1

フランクが示唆しているように、awkやcutはうまくいくはずです。またIFSと(仮定バッシュ)アレイをいじることができます:

_old_ifs="$IFS" 
IFS=":" 
ID_NAME_GRADE=($LINE) 
IFS="$_old_ifs" 

echo "Hello ${ID_NAME_GRADE[1]}, your grade is ${ID_NAME_GRADE[2]}" 
1

はこれを試してみてください:

 
$ while IFS=: read a b c; do echo $c; done < input.txt 

各行の3番目のフィールドをエコーすること。ニーズに合わせて変更します。

0

名前とスコアを抽出する方法はたくさんあります。例を参照してください:

kent$ cat t 
ABC12345:John Smith:78 
DEF12345:Jane Doe:80 
GHI12345:Bob Johnson:91 

#using awk 
kent$ awk -F: '{print "name="$2,", score="$3}' t           
name=John Smith , score=78 
name=Jane Doe , score=80 
name=Bob Johnson , score=91 

#using cat 
kent$ sed -r 's/[^:]*?:([^:]*):([0-9]*)$/name=\1, score=\2/g' t 
name=John Smith, score=78 
name=Jane Doe, score=80 
name=Bob Johnson, score=91 

#or just catch it directly with grep 
kent$ grep -Po "(?<=:)[^:]*(?=:)|(?<=:)\d+$" t 
John Smith 
78 
Jane Doe 
80 
Bob Johnson 
91 

カットすることもできます。

関連する問題