Изменить все положительные значения на отрицательные и наоборот, но в двух разных файлах

Используйте

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и коротких -логических тестов схемы.

-1
07.09.2020, 12:13
5 ответов

Небольшой вариант вашей попытки сработает:

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переменной

8
18.03.2021, 23:06
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
1
18.03.2021, 23:06

Это просто проблема разбора текста. Преобразуйте первый -в каждой строке в+:

$ 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 
2
18.03.2021, 23:06

Отрицательный 0 не применяется к целочисленным типам данных C. Когда число не имеет дробной части, awk преобразует его в строку, как будто с помощью printf("%ld").

Чтобы сохранить знак -0, вам понадобится что-то вроде:

awk '{$1 = sprintf("%g", -$1); print}'

Осторожно %gимеет 6-значную точность и переключается на инженерную нотацию для больших чисел. Вы можете заменить на %15g, например, для большей точности.

Вы можете сделать это в виде текста -без преобразования между строкой и числом с помощью:

perl -pe 's{(-?)(?=\d)}{$1 ? "" : "-"}e'

Преимущество этого также в том, что расстояние между полями не меняется. Вы также можете передать параметр -iдля perlдля редактирования файлов на месте (, которые затем необходимо передать в качестве аргументов, а не стандартного ввода ).

3
18.03.2021, 23:06
$ 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
1
18.03.2021, 23:06

Теги

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