LINUX.ORG.RU

Запись в конец строки

 , ,


2

1

Приветствую вас, участники интереснейшего форума! Передо мной стоит несложная задача, решить которую оказалось не так-то просто.

Я ищу слово из общего списка в другом списке и при условии, что слово есть во втором списке, дописываю в конец строки, содержащей данное слово в общем списке, одни символы, а если его нет во втором списке - другие символы.

Лучшее, чего мне удалось добиться - это:

Общий список - /home/user/internet-users.txt

Второй список - /home/user/users-external-mail.txt

while read user
     do
        result=`grep -i $user /home/user/users-external-mail.txt | wc -l`
            if [ $result != 0 ]; then
                sed -ie 's/\("$user".*\)$/\1;+/' "/home/user/internet-users.txt"
            else
                sed -ie 's/\("$user".*\)$/\1;/' "/home/user/internet-users.txt"
            fi
     done < "/home/user/internet-users.txt"

На выходе должен быть csv-файл вида

user;+;;+;
Но, как я понял, sed не поддерживает переменные. После запуска этого скрипта создается файл /home/user/internet-users.txte (добавляется «e» в конце «расширения») с идентичным исходному файлу содержимым.

В общем, проблема в том, как дописать в конец строки, искомой по переменной.

[xxxxx ~]$ cat total.txt
abc
bc
ab
[xxxxx ~]$ cat words.txt
ab
bc
[xxxxx ~]$ awk 'BEGIN{while (getline < "words.txt") word_exists[$0]=1}  {if(word_exists[$0]){print $0";1"}else{print $0";0"}}' total.txt
abc;0
bc;1
ab;1
[xxxxx ~]$

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

А как заставить его изменять файл total.txt? Файлов «words.txt» несколько, а результат нужно собрать в одном файле total.txt

firebolt
() автор топика

Проблема осталась нерешенной(( Может у кого-то еще есть идеи?

firebolt
() автор топика
Ответ на: комментарий от firebolt
[xxxxx ~]$ cat words1.txt
ab
cd
ac
db
[xxxxx ~]$ cat words2.txt
cd
ab
bc
[xxxxx ~]$ cat total.txt
del
ab
de
ac
aaa
bc
[xxxxx ~]$ (awk 'BEGIN{FS=";"; while (getline < "words1.txt") word_exists[$0]=1}  {if(word_exists[$1]){print $0";1"}else{print $0";0"}}' total.txt > total.txt.tmp ) && (mv total.txt.tmp total.txt)
[xxxxx ~]$ (awk 'BEGIN{FS=";"; while (getline < "words2.txt") word_exists[$0]=1}  {if(word_exists[$1]){print $0";1"}else{print $0";0"}}' total.txt > total.txt.tmp ) && (mv total.txt.tmp total.txt)
[xxxxx ~]$ cat total.txt
del;0;0
ab;1;1
de;0;0
ac;1;0
aaa;0;0
bc;0;1
[xxxxx ~]$

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

Одной командой несколько файлов сразу:

(awk 'BEGIN {FS = ";"; file_list = "words1.txt words2.txt"; size = split(file_list, files, " "); for(i in files) {while (getline < files[i]) word_exists[$0, i] = 1}} {str = $0; for(j = 1; j <= size; j++) {if (word_exists[$1, j]) {add = 1} else {add = 0}; str = str";"add}; print str}' total.txt  > total.txt.tmp) && (mv total.txt.tmp total.txt)
PHPFan
()

$ cat w1.lst
ab
cd
ac
db
$ cat w2.lst
cd
ab
bc
$ cat a.sh
#!/bin/sh

lnq=`cat w1.lst w2.lst | sort | uniq -d`
(
    while read l; do
        flg=0
        for i in $lnq; do
            if [ x"$l" = x"$i" ]; then
                flg=1
                break
            fi
        done
        echo -n "$l"
        if [ $flg -eq 0 ]; then
            echo -
        else
            echo +
        fi
    done
) < w1.lst
$ a.sh
ab+
cd+
ac-
db-
vodz ★★★★★
()
Ответ на: комментарий от PHPFan

Спасибо, я воспользовался отдельными командами, они мне понятнее. Всё работает.

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