2017-11-21 7 views
0

csvファイルの先頭行にはヘッダファイルがあります。この最初の行を読んでから、それを解析して、私が探している要素があるかどうかを調べる必要があります。 最初の行には4つの要素があります。 1. HDR 2.今日の日付3.日付から4.現在まで。UNIXシェルを使用して行を解析した後に行を解析する方法

ここでは最初の行を取得するために使用したコードです。

read -r header < "1" -- this game me the first row into header variable. 

この 'ヘッダー'変数を読み取って、さらに行を分割しようとしました。

read f1 f2 f3 < “$header” 
     echo "OS is  : $f1" 
     echo "Company is: $f2" 
     echo "Value is : $f3" 

値が表示されなくなります。理由は 'ヘッダー'が文字列として入力されない可能性があると私は思う。

私はUNIXシェルスクリプトの初心者です。助けてください。

+1

'$のheader'には何ですか?デバッグ中に '#!/ bin/bash -vx'でスクリプトを起動しましたか?どうしてあなたは[awk](https://www.gnu.org/software/gawk/)を使用しないのですか?あなたの質問を編集して改善してください... –

+0

あなたはスクリプト全体とその入力を表示しません。[MCVE]を編集して改善してください。 –

+0

他のコメントとは別にもう1つコメントしてください。私はどのように解析したいか分かりませんが、特殊な場合を除いてPOSIXシェルは、文字列の解析にはあまり便利ではありません(たとえば、正規表現が利用できないなど)。他のシェルに切り替えることをお勧めします(私はZshが好きですが、ここでもbashが便利だと思います)。まったく別のプログラミング言語(Ruby、Perl、awk、Pythonなど)に切り替えることをお勧めします。 – user1934428

答えて

0
read -r header < "1" 

<redirectionのために使用されているので、あなたは(おそらく存在しないので、readが失敗している)1という名前のファイルからの読み込みをしている番号。ターミナルでそのコマンドを入力すると、エラーが発生します(「no such file or directory」)。

read f1 f2 f3 < “$header” 

これは間違っています。 headerシェル変数が<redirection

のために使用されているので、あなたが1 2 3という名前のファイル(内部の二つの空間で6文字のファイルパス)から読んでいる1 2 3含まれている場合は、いくつかの列を含む行で作られたファイルを処理するawkの使用を検討してください。

デバッグ段階で#!/bin/bash -vx(トレースを取得する)で(実行可能な)シェルスクリプトを開始することを検討してください。数時間、shell scripting tutorial、次にbash reference manualを読んでください。

どのようにシェルwork、特にそのglobbingを理解するようにしてください。すべてのプログラム(たとえば、いくつかのシェルによって起動される)はexecve(2)(一部ではprocessで実行されます。たとえばシェルプロセス)によって開始されることに注意してください。 read f1 f2 f3 < “$header”の前に、(一時的に)デバッグ出力を追加することができます。

echo "header=" "$header" > /dev/stderr 

シェルスクリプトで何が起こっているのかを理解する。

(あなたは本当にシェルについての詳細を読んでを費やす必要があります)

関連する問題