두 개의 데이터 파일이 있고 one.txt
Linux two.txt
시스템에 있습니다. 모든 양수 값을 음수로 one.txt
또는 그 반대로 변환하고 싶지만 two.txt
첫 번째 열에서만 가능합니다. 데이터에는 0도 포함되어 있습니다.
one.txt
다음과 같습니다:
10 35.74
8 35.74
6 35.74
4 35.74
2 35.74
0 35.74
two.txt
이와 같이
-20 35.74
-18 35.74
-16 35.74
-14 35.74
-12 35.74
-0 35.74
one.txt
나는 이것을 다음과 같이 바꾸고 싶다 :
-10 35.74
-8 35.74
-6 35.74
-4 35.74
-2 35.74
-0 35.74
마찬가지로 음수 값을 모두 양수 값으로 변경하고 싶습니다.two.txt
나는 그것을 시도했지만 awk '$1 *= -1' file.txt
그것은 0을 엉망으로 만들었습니다.
이 두 가지 문제를 두 가지 다른 프로세스에서 실행해야 합니다. 그래서 나는 한 단계로 해결하는 대신 각 문제에 대해 두 가지 다른 솔루션/코드를 사용하는 것을 선호합니다.
답변1
시도를 약간 변형하면 효과가 있습니다.
awk '{ $1 *= -1 } 1' file.txt
문제는 awk '$1 *= -1'
이것이 $1 *= -1
조건으로 처리된다는 점입니다. 그 효과는 적용되지만 조건이 되므로 결과가 0이 아닌 경우에만 처리된 행이 출력됩니다.
중괄호를 추가하면 모든 줄에 곱셈이 적용되어 그 자체로 1
모든 줄이 인쇄됩니다. 빈 줄을 변경하지 않으려면 곱셈에 조건을 추가할 수 있습니다.
awk 'NF { $1 *= -1 } 1' file.txt
Gawk1을 사용하는 경우 첫 번째 열을 변경하기 전에 숫자인지 확인할 수 있습니다.
awk 'typeof($1) == "strnum" { $1 *= -1 } 1' file.txt
POSIXLY_CORRECT
1. 환경에 변수가 없습니다.
답변2
이것은 단지 텍스트 구문 분석 문제입니다. 각 줄의 첫 번째 줄을 -
다음으로 변환합니다 +
.
$ 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
답변3
음수 0은 정수 C 데이터 유형에 적용되지 않습니다. 숫자에 소수 부분이 없으면 awk는 를 사용하는 것처럼 이를 문자열로 변환합니다 printf("%ld")
.
기호를 보존하려면 -0
다음과 같은 것이 필요합니다.
awk '{$1 = sprintf("%g", -$1); print}'
주의할 점은 %g
정밀도가 6자리이며 큰 숫자에 대해서는 공학 표기법으로 전환됩니다. %15g
예를 들어, 더 나은 정확성을 위해 로 바꿀 수 있습니다.
문자열과 숫자 사이를 앞뒤로 변환하지 않고도 텍스트로 수행할 수 있습니다.
perl -pe 's{(-?)(?=\d)}{$1 ? "" : "-"}e'
이는 필드 사이의 간격을 변경하지 않는다는 이점도 있습니다. 파일을 그 자리에서 편집 -i
하는 옵션을 전달할 수도 있습니다 perl
(그런 다음 표준 입력이 아닌 인수로 전달해야 함).
답변4
$ 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