LINUX.ORG.RU

Bash. Разделить строчку на две


0

1

Имеется файл, в каждой строке которого имеется два слова, разделённых пробелом. Как разделить в две переменные ети слова? Пробую:

cat text.txt | while read line
do
        word1=`echo $line | sed 's/\(^.*\) .*$/\1/g'`
        word2=`echo $line | sed 's/^.*\( .*$\)/\1/g'`
        #some_stuff
done

Дело в том, что в #some_stuff сравнивается около 80000 таких строк с такого же типа 80000 строками и работает всё очень медленно. Есть ли более быстрые варианты, помимо sed?

$ echo "test ask" | awk '{print $1; print $2}'
test
ask
anonymous ()
Ответ на: комментарий от ABW
while read word1 word2 ; do
  : # some_stuff
done < text.txt

Воооо! Совсем другое дело! А awk, к сожалению далеко от sed не ушёл :(

abr_linux ()
Ответ на: комментарий от anonymous

Плюсую.

Хорошо, что именно? Как только строки с sed и awn убрал, стало работать в разы быстрее Вот код:

cat text1.txt | while read line
do
        sed -i '1,1d' text2.txt
        echo war4.txt has `cat war4.txt | wc -l` lines
#       word_orig1=`echo $line1 | sed 's/\(^.*\) .*$/\1/g'`
#       word_anagr1=`echo $line1 | sed 's/^.*\( .*$\)/\1/g'`
#       word_orig1=`echo $line1 | awk '{print $1}'`
#       word_anagr1=`echo $line1 | awk '{print $2}'`
        cat text2.txt | while read line2
        do
#очень долго работал вот етот цикл
#               word_orig2=`echo $line2 | sed 's/\(^.*\) .*$/\1/g'`
#               word_anagr2=`echo $line2 | sed 's/^.*\( .*$\)/\1/g'`
#               word_orig2=`echo $line2 | awk '{print $1}'`
#               word_anagr2=`echo $line2 | awk '{print $2}'`
                if [ $word_anagr1 = $word_anagr2 ]
                then
#тело условия отрабатывает в 3% случаев
                        if [ $word_orig1 != $word_orig2 ]
                        then
                                echo "$word_orig1" is anagram "$word_orig2"
                                if [ `grep $word_orig1 anagram.txt | wc -l` == 0 ]
                                then
                                        echo "$word_orig1" is not found in anagrams. Adding
                                        echo $word_orig1 >> anagram.txt
                                fi
                                if [ `grep $word_orig2 anagram.txt | wc -l` == 0 ]
                                then
                                        echo "$word_orig2" is not found in anagrams. Adding
                                        echo $word_orig2 >> anagram.txt
                                fi
                        fi
                fi
        done
done

abr_linux ()
Ответ на: комментарий от abr_linux

join -1 2 -2 2 ... не подходит?

И судя по скрипту можно, можно было и внутри awk это делать: там есть ассоциативные массивы (в END запись в файл), было бы быстрее grep.

anonymous ()
Ответ на: комментарий от anonymous

join -1 2 -2 2 ...

файлы только надо отсортированные, и предполагается что 2 поле уникально

anonymous ()
Ответ на: комментарий от abr_linux

if [ `grep $word_orig1 anagram.txt | wc -l` == 0 ]
                                then
                                        echo "$word_orig1" is not found in anagrams. Adding
                                        echo $word_orig1 >> anagram.txt
                                fi

может лучше так?

grep -q $word_orig1 anagram.txt || { 
    echo "$word_orig1" is not found in anagrams. Adding
    echo $word_orig1 >> anagram.txt
}

lazyklimm ★★★★★ ()
Ответ на: комментарий от abr_linux
if [ `grep $word_orig1 anagram.txt | wc -l` == 0 ]
                                then
                                        echo "$word_orig1" is not found in anagrams. Adding
                                        echo $word_orig1 >> anagram.txt
                                fi
                                if [ `grep $word_orig2 anagram.txt | wc -l` == 0 ]
                                then
                                        echo "$word_orig2" is not found in anagrams. Adding
                                        echo $word_orig2 >> anagram.txt
                                fi

вынести повторяющийся код в функцию

lazyklimm ★★★★★ ()

Может быть, лучше на Perl переписать?

AITap ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.