awk управляют для парсинга файла

У Вас все еще есть исходный пакет? Можно проанализировать Make-файл для команд установки, или можно установить его снова (с другим $PREFIX) получать список установленных файлов. Кроме того, это печатается к STDOUT. Вы могли затем удалить те файлы из каталога, где они были установлены первоначально.

Править:

Я просто вскопал свои примечания по созданию сценария деинсталлятора. Терпите меня, я перефразирую здесь.

После того, как Вы создаете и устанавливаете на временном целевом каталоге, делаете следующее. (Где $PREFIX то, с чем Вы использовали ./configure.)

cd $PREFIX
find . -type f | cut -b 1 --complement | sed 's/^/rm -f \/usr\/local/g' > uninstall.sh
find . -type d | cut -b 1 --complement | sed 's/^/rmdir --ignore-fail-on-non-empty \/usr\/local/g' >> uninstall.sh

Вывод будет похож:

rm -f /usr/local/lib/somelib.so
rm -f /usr/local/bin/somebin
rm -f /usr/local/include/someapp/someheaders.h
rmdir --ignore-fail-on-non-empty /usr/local/share
rmdir --ignore-fail-on-non-empty /usr/local/bin
rmdir --ignore-fail-on-non-empty /usr/local/include/someapp
...

Это на самом деле не удаляет критические системные каталоги (/usr/local/bin, и т.д.), потому что они будут непусты. Кроме того, Вы захотите подтвердить что Ваш ./configure использование сценария /usr/local как значение по умолчанию $PREFIX. Корректируйтесь sed команда по мере необходимости.

4
05.06.2014, 21:46
3 ответа
awk 'NR > 1 { for (i = 6; i <= NF; i++) if ($i < 100) $i = "NA" }; 1' yourfile.txt

Дополнено комментариями:

NR > 1 {                         # skipping NR == 1, the first line
    for (i = 6; i <= NF; i++)    # column 6 to the end, skipping first 5
        if ($i < 100) $i = "NA"  # self-explanatory
}

1 # print all lines; 1 evaluates to true, and default action is print

Изменить: есть несколько способов установить OFS . Самый краткий способ, который я могу придумать, - это добавить OFS = '\ t' перед именем файла.

awk '...' OFS='\t' file.txt
awk -v OFS='\t' '...' file.txt
awk 'BEGIN { OFS="\t" }; ...' file.txt
9
27.01.2020, 20:46
sed '1n;s|$| |;:na
    s|\([+-] .*\) [+-]*[0-9]\{1,2\} |\1 NA |
    t na;s| $||'

Судя по данным, которые вы показываете, нет причин, по которым этот маленький sed s ///; функция t не должна работать, я не думаю. (Спасибо jw013 за указание на потенциально пропущенный последний столбец.) Это просто заменяет каждую 1- или 2-символьную числовую строку после +/- , затем в строке с все, что ему предшествовало, и NA , пока больше нечего будет заменять.

Вот еще одна версия без рекурсии, в которой используется старое пространство h sed :

sed '1n;h;s|.*[+-] ||;s|$| |
    s| [+-]*[0-9]\{1,2\} | NA |g
    x;G;s|\([+-] *\).*\n|\1|;s| $||'

Он опирается на тот же маркер и разделяет строку там - первую половину остается нетронутым в h старом пространстве, в то время как он полностью удаляется из пространства шаблонов. Затем мы выполняем глобальную замену для всех 1,2 числовых символьных слов, добавляем в h старое пространство, e x изменяем шаблон и h старые пробелы и удаляем все, что находится между маркером и \ n ewline, вставленным в результате операции добавления.

2
27.01.2020, 20:46

jw013 уже дал вам хорошее решение на awk, но поскольку вы упомянули Perl:

perl -lane 'map{$_="NA" if $_<100}@F[5..$#F] if $.>1; print join "\t", "@F"' file 

Объяснение

  • perl -lane : обрабатывает каждую входную строку (-n) и разбивает ее на пробельные символы в массив @F (-a), затем запускает сценарий, заданный -e. Команда -l удаляет новые строки в конце каждой строки и добавляет \n к каждому оператору print.

  • map{$_="NA" if $_<100}@F[5..$#F] : для каждого элемента массива @F (поля), начиная с 6-го и до конца, изменить этот элемент на "NA", если он меньше 100.

  • if $.>1; : предыдущий map{} будет выполняться только если это не первая строка.

  • print join "\t", "@F"' : соедините каждый элемент массива @F с табуляцией (как указано в вашем комментарии к ответу jw013) и выведите его.

5
27.01.2020, 20:46

Теги

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