У Вас все еще есть исходный пакет? Можно проанализировать 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
команда по мере необходимости.
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
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, вставленным в результате операции добавления.
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) и выведите его.