2016-10-20 1 views
0

Я пытаюсь зациклить файл с помощью разделителя с символом «,» и распечатать эти значения в «списке», но я не уверен, как получить все значения разделителя.Как закодировать строку значений с помощью ',' и напечатать ее как список. Unix Korn Shell

У меня есть файл с электронной почты, как это (все в одной строке):

[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 

Я 1-100 из-я m не уверен, сколько значений может иметь файл.

вывод, что я получаю:

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

Ожидаемый результат:

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

Любая идея?

+1

[Не Читать строки с 'for' (http://mywiki.wooledge.org/DontReadLinesWithFor). –

+0

... кроме того, хотя - какая версия ksh это? ksh93? ksh88? какой-то случайный клон, написанный человеком, отличным от Дэвида Корна? –

+0

не уверен, что такое ksh, как я могу это проверить? –

ответ

3

Следующие работы с Дэвидом Korn ksh93:

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

В общем, избегайте использования $(), cat, cut, & гр. если это абсолютно необходимо; они намного медленнее возможностей оболочки (особенно в ksh, которая является исключительно высокопроизводительной оболочкой).

+0

Мы также хотели бы использовать 'cut' в аналогичной [проблеме] (http://stackoverflow.com/q/40053819/1527780), чтобы получать все файлы под' find' и 'grep'. – marikamitsos

+0

@marikamitsos, ... нет веских оснований для использования 'cut' для этой цели.Безопасный способ чтения списка раз и произвольных имен файлов из 'find' заключается в использовании строки формата' -printf', которая помещает NUL после имени и символ, который не может существовать в метке времени между временем и имя и использовать два отдельных 'read' в каждой итерации цикла для заполнения переменной для каждого значения. (Newlines может существовать в именах файлов, но NUL не могут, поэтому '\ n' - ваша строка формата менее безопасна, чем' \ 0'). –

+0

@marikamitsos, ... так, чтобы безопасно завершить чтение в родном bash, например: 'while IFS = read -r -d $ '\ t' timestamp && 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