2016-10-20 7 views
0

'、'でデリミタを使ってファイルをループさせようとしていて、それらの値を「リスト」に出力していますが、デリミタの値をすべて取得する方法がわかりません。'、'を使用して値の行をループし、それをリストとして出力する方法。 Unix Korn Shell

私はこのような電子メールでファイル(すべて1行で)持っている:

[email protected],[email protected],[email protected]

を、私のスクリプトは、このようなものです:

EmailsFile="/dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt" 

for email in $(cat ${EmailsFile} | cut -d "," -f 1-100) 
do 
    echo "${email}\n" 
done 

私は「Iによる1-100をしましたファイルを持つことができる値の数が不明です。私は取得しています

出力は次のようになります。

[email protected],[email protected],[email protected]

予想される出力:

[email protected] 
[email protected] 
[email protected] 

任意のアイデア?

+1

を試してみてください[しませんが'for'で行を読む(http://mywiki.wooledge.org/DontReadLinesWithFor)。 –

+0

...それを超えて、どのkshバージョンがこれですか? ksh93? ksh88? David Korn以外の人が書いたランダムなクローン? –

+0

kshはそれを確認できません。どうすれば確認できますか? –

答えて

3

デイビット・コーンは、ksh93と、次の作品:一般的に

EmailsFile="/dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt" 
while IFS=, read -r -A emails; do 
    printf '%s\n' "${emails[@]}" 
done <"$EmailsFile" 

$()catcut、& Cを使用しないでください。絶対に必要な場合を除き、シェルの組み込み機能(特にkshでは非常に高性能なシェルです)よりはるかに遅いです。

+0

同様の[issue](http://stackoverflow.com/q/40053819/1527780)で 'cut'を使用して、' find'と 'grep'の下のすべてのファイルを受け取ることもできます。 – marikamitsos

+0

@marikamitsos、...その目的のために 'cut'を使う良い理由はありません。時間のリストと 'find 'からの任意のファイル名を読むための安全な方法は、名前の後ろにNULを置く' -printf'形式の文字列と、時間と文字列の間のタイムスタンプに存在しない文字を使うことです各ループ反復で2つの別々の 'read'を使用して、各値の変数を設定します。 (改行はファイル名に存在することができますが、NULはできませんので、 '\ n'はあなたの書式文字列で' \ 0'よりも安全ではありません)。 –

+0

@marikamitsos、...だから、ネイティブのbashで読み込み終了を安全に行うために、 'IFS = read -r -d $ '\ t'タイムスタンプ&& IFS = read -r -d '' filename;行う ...; done <<(find ... -printf '%T @ \ t%p \ 0') ' –

1

あなたにもsedを使用することができます。

sed 's/,/\n/g' "$EmailsFile" 
0

使用tr

tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt 

あなたは各行のいくつかの単語を追加したい場合は、

printf "found address %s in input\n" $(tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt 
関連する問題