Удалить определенное слово в файле

В развитие ответа sjsam'а, но проще:

awk -v FS="," '
    {
            f2[$2] = f2[$2] "-" $1   # append "-" and $1 to the current value
    }
    END {   # This code will be processed at the end
            for (i in f2) {  # for all the indexes i in f2
                             # (i.e., each unique value from column 2)
                             # print one line in the desired format
                printf "%s,%s\n", i, gensub("-", "", 1, f2[i])
            }
    }
'

Эта программа простодушно строит строки, которые выглядят так:

   -       pw1jc5ssyt6hx618      -       pht92h4adr3mrbz3      -       alnac47rt8d4ege3
(hyphen)       (value)        (hyphen)       (value)        (hyphen)       (value)

(но без пробелов, они просто для подсветки).  Затем, когда приходит время печатать данные, он удаляет первые - с помощью общей функции подстановки, gensub().  К сожалению, это не поддерживается в спецификации POSIX для awk; для этого требуется GNU Awk.  В качестве альтернативы можно изменить gensub("-", "", 1, f2[i]) на substr(f2[i], 2) и получить подстроку f2[i] от второго символа до конца (т.е. все, кроме первого символа, а это -), способом, соответствующим стандарту POSIX.

При этом будет (сделана попытка) обработать каждую строку во входных данных.  Если во входных данных есть строки, которые должны быть проигнорированы. (например, пустые строки), вы можете изменить первую часть на

    /./ {
            f2[$2] = f2[$2] "-" $1   # …
    }

или

    NF==2 {
            f2[$2] = f2[$2] "-" $1   # …
    }

Когда я запускаю ответ sjsam или свой собственный, я получаю

254333,ysezaratlycpuggl-gqjp2rsjmk1a2v9c-twdzyi2ddbnrfknd-tpqorqbyrg1nmm7s
254341,gcmj7krrx5x6nf8r
254343,pw1jc5ssyt6hx618-pht92h4adr3mrbz3-alnac47rt8d4ege3
254344,hguvgstqxu3gowfg

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

awk -v FS="," '
    {
            if (! ($2 in f2)) appearance[++x] = $2
            f2[$2] = f2[$2] "-" $1   # append "-" and $1 to the current value
    }
    END {   # This code will be processed at the end
            for (ix in appearance) {
                             # for all the indexes i in f2
                             # (i.e., each unique value from column 2)
                             # print one line in the desired format
                i = appearance[ix]
                printf "%s,%s\n", i, gensub("-", "", 1, f2[i])
            }
    }
'

который использует массив appearance для отслеживания порядка появления.

3
24.05.2016, 20:12
3 ответа

Вы можете попробовать замену sed

$ sed -e 's/abcd[0-9]*//g' -e 's/*test[0-9]*://g' file

Где abcd [0-9] * соответствует каждые ] abcd , за которым следует число, то же самое с * test [0-9] *:

1
27.01.2020, 21:27

если вам нужно удалить всегда одно и то же предложение, вы можете попробовать

sed -e 's/abcd[0-9]*//g' -e 's/*test[0-9]*://g' file.ext

это покажет вам вывод в stdout, если вы хотите сохранить этот вывод просто добавьте > в конец инструкции или >> для добавления содержимого в другой файл

sed -e 's/abcd[0-9]*//g' -e 's/*test[0-9]*://g' file.ext>new_file.ext
sed -e 's/abcd[0-9]*//g' -e 's/*test[0-9]*://g' file.ext>>new_file.ext

затем вы можете удалить старый файл и заменить его новым

rm file.ext
mv new_file.ext file.ext
0
27.01.2020, 21:27

Решение с использованием cut:

cat $FILE | cut -d' ' -f4,6 --complement
1
27.01.2020, 21:27

Теги

Похожие вопросы