2015-07-24 3 views
0

Я так много сражался с этим в прошлый час или около того, я пытаюсь получить текстовый файл, заполненный именами, в массив этих слов ,Разделение списка слов из текстового файла в массив в BASH

Текстовый файл отформатирован:

Word1~~Word2 Word1~~Word2

.. В конце концов, я хочу, чтобы разделить эти слова на 2 массивы word1 и word2 разбивающихся на «~~», но это является проблемой для позже

Сейчас я (в настоящее время) есть это:

#!/bin/bash 

a=$(cat ~/words.txt) 
c=0 

for word in $a 
do 
    arrayone[$c]=(echo $word) 
    c=$((c+1)) 
done 

Я пробовал много много других способов, и все й Ther не работают или без ошибок при исполнении, я относительно новым в BASH, и я с крайним трудно с синтаксисом

Спасибо за ваше время

+2

[не читать строки с 'for'] (http://mywiki.wooledge.org/DontReadLinesWithFor). Прочтите [Bash FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001) для различных способов сделать это безопасно. –

+0

Кроме того, запустите свой код через http://shellcheck.net/ перед публикацией здесь, где будет указано (среди прочего) BashPitfalls # 14: http://mywiki.wooledge.org/BashPitfalls –

ответ

2

Это на самом деле так же, как легко решить ваши «позже» проблема прямо сейчас. Если вам нужно, чтобы быть в состоянии иметь дело со словами, с (непарными) буквальными ~ символами, это будет делать:

declare -a arr1=() arr2=() 
while IFS='~' read -r word1 _ word2; do 
    arr1+=("$word1") 
    arr2+=("$word2") 
done <file 

printf 'Words in column 1:\n' 
printf ' %s\n' "${arr1[@]}" 

printf 'Words in column 2:\n' 
printf ' %s\n' "${arr2[@]}" 

Если вы сделать необходимости иметь дело с более интересным случаем, рассматривая только двойная тильду как специальной , один подход к выполнению так спичка регулярного выражения:

while IFS='' read -r line; do 
    if [[ $line =~ (.*)[~][~](.*) ]]; then 
    arr1+=("${BASH_REMATCH[1]}") 
    arr2+=("${BASH_REMATCH[2]}") 
    else 
    printf 'Line does not match pattern: %s\n' "$line" >&2 
    fi 
done <file 
+0

После выполнения заявления declare I получить ту же ошибку, которую я получаю, когда я пробую большинство вещей, которые я недавно пробовал с этого сайта: «test.sh: 5: test.sh: Синтаксическая ошибка:» («неожиданно». Также, что такое <файл? – CodyJae

+0

Является ли ваша оболочка действительно bash? Использование '#!/bin/sh' или' sh yourscript' означает, что вы используете POSIX sh, а не bash; POSIX sh вообще не имеет массивов. –

+0

Что такое вывод 'echo '$ BASH_VERSION" , если он помещен в ваш скрипт? –

Смежные вопросы