テキストファイルを読み、情報を変数に保存する

テキストファイルを読み、情報を変数に保存する

次の形式のレコードを含むテキストファイルがあります。

SCI.txt

12-12-1990
12-12-1991
CSE Department

または

12-12-1990,12-12-1991,CSE Department

3つの変数に保存したいです。

a,b,c

txtファイルを読み取り、シェルスクリプト(ksh)を使用して値を変数に保存しようとしています。

- - 更新 - -

インターネット上のほぼすべての方法を試してみました。私はそれらを動作させることができません。

今私はこの方法を試しています。

#!/usr/bin/ksh
#reading the file content and storing in variable
_input="sci.txt"
while IFS='|' read -r fdate rdate dcname
do
   echo "$fdate $rdate $dcname"
done < "$_input"

sci.txtの内容は次のとおりです

demo1|demo2|demo3

しかし、上記の方法では何の結果も得られません。

ベストアンサー1

sci.txt改行文字で終わるとは思えません。で述べたように、man ksh組み込みread関数はデフォルトで最初の改行文字を読み取ります。

  read [ -ACSprsv ] [ -d delim] [ -n n] [ [ -N n] [ [ -t  timeout]  [  -u
   unit] [ vname?prompt ] [ vname ... ]
          The  shell  input  mechanism.  One line is read and is broken up
          into fields using the characters  in  IFS  as  separators.   The
          escape  character,  \, is used to remove any special meaning for
          the next character and for line  continuation.   The  -d  option
          causes  the  read  to  continue  to the first character of delim
          rather than new-line.

したがって、を使用しない場合は改行文字を探します-d。ファイルにファイルがない場合、実際には何も読みません。表示するには:

$ printf 'demo1|demo2|demo3\n' > sci.newline
$ printf 'demo1|demo2|demo3' > sci.nonewline

$ cat foo.sh
#!/usr/bin/ksh
for file in sci.newline sci.nonewline; do
    echo "Running on: $file"
    while IFS='|' read -r fdate rdate dcname
    do
        echo "$fdate $rdate $dcname"
    done < "$file"
done

このスクリプトを実行すると、予想される出力が返されますが、sci.newline次は返されませんsci.nonewline

$ foo.sh < sci.nonewline 
Running on: sci.newline
demo1 demo2 demo3
Running on: sci.nonewline

したがって、ファイルが\n改行()で終わると、すべてが期待どおりに機能するはずです。


今、あなたのステートメントがループの外で動作するのは、echoループが実行されていないためです。文字が見つからない場合は、ゼロ以外の(失敗)終了ステータスを返しますread。成功するたびに設定が実行されます。失敗はループを実行せず、ループの内部も実行しません。代わりに、スクリプトはコマンドを実行して変数を割り当てた後に失敗を返すため、次のセクションに進みます。これが、次の項目(ループ外の項目)が期待どおりに機能する理由です。\nwhile SOMETHING; doSOMETHINGreadechoreadreadecho

おすすめ記事