Используйте
test -f /root/.bash_aliases || echo "$_"
или
test -f /root/.bash_aliases || printf '%s\n' "$_"
$_
расширится до последнего аргумента предыдущей команды. В вашем примере предыдущая команда — [
, а ее последний аргумент — ]
.
Выше последняя команда — test
, а ее последний аргумент — имя файла.
test
и [
— это одни и те же команды, но [
требует ]
в качестве последнего аргумента командной строки. В данном случае именно это затрудняет использование $_
для получения имени файла.
Вышеприведенное решение работает как минимум в bash
(, если у вас нет DEBUG
набора ловушек )и zsh
.
Если у вас есть имя файла в переменной, это было бы тривиально сделать
[ -f "$name" ] || printf '%s\n' "$name"
или
if [ ! -f "$name" ]; then
printf '%s\n' "$name"
fi
в зависимости от ваших предпочтений для операторов if
и коротких -логических тестов схемы.
Небольшой вариант вашей попытки сработает:
awk '{ $1 *= -1 } 1' file.txt
Проблема с awk '$1 *= -1'
заключается в том, что $1 *= -1
принимается как условие; его эффект применяется, но затем принимается как условие, поэтому обработанная строка выводится только в том случае, если результат не равен -нулю.
Добавление фигурных скобок приводит к тому, что умножение применяется ко всем строкам, а 1
сам по себе приводит к печати всех строк. Чтобы не менять пустые строки, можно добавить к умножению условие:
awk 'NF { $1 *= -1 } 1' file.txt
Если вы используете Gawk¹, вы можете проверить, является ли первый столбец числом, прежде чем изменять его:
awk 'typeof($1) == "strnum" { $1 *= -1 } 1' file.txt
¹ и в окружении нет POSIXLY_CORRECT
переменной
sed 's/ \([0-9]\)/-\1/' one.txt > output-one.txt
заменяет первое вхождение пробела, за которым следует цифра, на минус, за которым следует захваченная цифра.
sed 's/-\([0-9]\)/ \1/' two.txt > output-two.txt
заменяет первое вхождение минуса, за которым следует цифра, пробелом, за которым следует захваченная цифра.
Если вы хотите иметь явные положительные знаки, вы можете использовать
sed 's/-\([0-9]\)/+\1/' two.txt > output-two.txt
Если вы хотите изменить входной файл и если ваш sed
поддерживает редактирование места -, вы можете использовать
sed -i 's/ \([0-9]\)/-\1/' one.txt
sed -i 's/-\([0-9]\)/ \1/' two.txt
sed -i 's/-\([0-9]\)/+\1/' two.txt
Это просто проблема разбора текста. Преобразуйте первый -
в каждой строке в+
:
$ sed 's/-/+/' two.txt
+20 35.74
+18 35.74
+16 35.74
+14 35.74
+12 35.74
+0 35.74
И добавьте -
перед первым числом в каждой строке (ваши файлы, похоже, имеют начальные пробелы):
$ sed -E 's/[0-9]/-&/' one.txt
-10 35.74
-8 35.74
-6 35.74
-4 35.74
-2 35.74
-0 35.74
Если в ваших файлах нет начального пробела, показанного в вопросе, вы можете упростить его до:
sed -E 's/^/-/' one.txt
Во всех случаях вы можете использовать -i
для редактирования файла на месте:
sed -i 's/-/+/' two.txt
sed -i -E 's/[0-9]/-&/' one.txt
Отрицательный 0 не применяется к целочисленным типам данных C. Когда число не имеет дробной части, awk преобразует его в строку, как будто с помощью printf("%ld")
.
Чтобы сохранить знак -0
, вам понадобится что-то вроде:
awk '{$1 = sprintf("%g", -$1); print}'
Осторожно %g
имеет 6-значную точность и переключается на инженерную нотацию для больших чисел. Вы можете заменить на %15g
, например, для большей точности.
Вы можете сделать это в виде текста -без преобразования между строкой и числом с помощью:
perl -pe 's{(-?)(?=\d)}{$1 ? "" : "-"}e'
Преимущество этого также в том, что расстояние между полями не меняется. Вы также можете передать параметр -i
для perl
для редактирования файлов на месте (, которые затем необходимо передать в качестве аргументов, а не стандартного ввода ).
$ awk '!sub(/-/,"",$1){$1="-"$1} 1' one.txt
-10 35.74
-8 35.74
-6 35.74
-4 35.74
-2 35.74
-0 35.74
$ awk '!sub(/-/,"",$1){$1="-"$1} 1' two.txt
20 35.74
18 35.74
16 35.74
14 35.74
12 35.74
0 35.74