次の形式のレコードを含むテキストファイルがあります。
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
。成功するたびに設定が実行されます。失敗はループを実行せず、ループの内部も実行しません。代わりに、スクリプトはコマンドを実行して変数を割り当てた後に失敗を返すため、次のセクションに進みます。これが、次の項目(ループ外の項目)が期待どおりに機能する理由です。\n
while SOMETHING; do
SOMETHING
read
echo
read
read
echo
答え2
while IFS=" ," read a b c; do
echo a: $a b: $b c: $c
done < SCI.txt