모든 양수 값을 음수 값으로 또는 그 반대로 변경하지만 두 개의 다른 파일에서

모든 양수 값을 음수 값으로 또는 그 반대로 변경하지만 두 개의 다른 파일에서

두 개의 데이터 파일이 있고 one.txtLinux 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_CORRECT1. 환경에 변수가 없습니다.

답변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

관련 정보