두 열의 값을 결합하는 방법은 무엇입니까?

두 열의 값을 결합하는 방법은 무엇입니까?

다음 형식의 파일이 있습니다.

$ cat /tmp/raw
2015-01   5000   1000
2015-02   6000   2000
2015-03   7000   3000

이제 내가 원하는 것은 각 행의 열 2와 열 3에서 결합된 값을 얻는 것입니다. 결과는 다음과 같습니다.

2015-01   6000
2015-02   8000
2015-03   9000

이것을 시도했지만 파일의 마지막 값만 표시됩니다(예: 2015-03 값).

답변1

여러 가지 방법이 있습니다:

  1. 또 다른 awk 방법

    awk '{$2+=$3;}NF--' file
    
  2. perl -lane 'print "$F[0] ",$F[1]+$F[2]' file
    

    또는

    perl -ape 's/$F[1].*/$F[1]+$F[2]/e' file
    
  3. 셸(위보다 훨씬 느리거나 효율성이 떨어짐)

    while read a b c; do echo "$a $((b + c))"; done < file
    

답변2

다음을 사용해 볼 수 있습니다 awk.

awk '{ print $1, $2 + $3; }' /tmp/raw

결과는 다음과 같습니다(2015-03의 값은 10000이어야 한다고 생각합니다).

2015-01 6000
2015-02 8000
2015-03 10000

답변3

sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc

...인쇄...

2015-01   6000
2015-02   8000
2015-03   10000

그래서 위에서 나는 다음을 선언했습니다.정규식그것은필드 범위에 의해*가변 길이단일 문자 시퀀스는 다음과 같습니다.^<space> 아님이어서*가변 길이단일 문자 시퀀스는 다음과 같습니다.<스페이스>. 이 선언이 적용되는 패턴 공간 sed은 구분된 문자열입니다.(기본적으로)입력에 나타나는 모든 줄 문자를 \n재귀적으로 교체합니다.(기본적으로)다음은 같은 상황이 발생할 때마다 사용됩니다.

선언된 인터페이스에는 두 가지 수준이 있으며 각 수준은 다음으로 구성됩니다.마지막 하나 국제 IEEE 공식 표준 위원회sed명령 구문의 예측 가능한 적용을 보장합니다 .sedAPI 구문예를 들어 이 경우 /address 명령을 /적용하면sed s///(이것은 항상 대체 명령의 첫 번째 구성 요소입니다.), 그러나 동일한 콘텐츠는 보다 기본적인 API에 의해 지정된 콘텐츠의 하위 집합으로 해석됩니다.regcomp()기능하다표준 C 라이브러리.

나는 이 말을 자신 있게 할 수 있다. sed왜냐하면아니요는 단지 프로그램일 뿐이지만 sed내 Unix 계열 컴퓨터에 명명된 컴파일된 실행 파일은구현하다잘 정의되고, 오랫동안 확립되었으며, 표준에 의해 통제됩니다.sed 애플리케이션내 시스템의 정규식 일치 라이브러리입니다.


sed사양 에서 :

유틸리티는 sed지원해야합니다XBD 기본 정규식...

...어디에서 찾을 수 있나요?

POSIX.1-2008 시스템 인터페이스 볼륨의 정규식 일치 인터페이스는 BRE 및 ERE를 지원합니다.regcomp(),regexec()및 관련 기능을 제공합니다.

애플리케이션 호출regcomp()그것을 렌더링 할 것이다무늬문자열과...

...[이것regcomp()함수는 가리키는 문자열에 포함된 정규식을 컴파일해야 합니다.무늬인수를 입력하고 결과를 구조에 넣습니다.프리프레그...

이와 관련하여 조치를 취하기 위해 해당 신청서는 다음을 참조합니다.regcomp()컴패니언 기능...

...[이것regexec()함수는 다음과 같이 지정된 null로 끝나는 문자열을 비교합니다.컴파일된 정규식 사용프리프레그이전 호출로 초기화됨regcomp()...

...regexec()[an] 배열의 요소는 하위 문자열의 오프셋으로 채워져야 합니다.에 해당\(괄호로 묶인 하위 표현식\)~의무늬...무늬그 자체는 하위 표현식으로 간주됩니다...

...[이것regexec()함수는 모든 항목을 채워야 합니다.성냥주요 요점성냥, 어디성냥그리고성냥일부 요소가 있더라도 애플리케이션에서 제공성냥하위 표현식에 해당하지 않습니다.무늬.


그래서 내가 이 일을 할 때...

/[^ ]* */

... sed첫 번째엮다정규식을 사용하여 결과를 메모리에 저장한 다음 거기에 저장된 컴파일된 자동 장치를 내 명령을 충족하는 데 필요한 만큼 내 패턴 공간의 내용에 적용합니다. 각 실행의 결과는 하나 이상의 null로 구분된 배열입니다.필드반환된 오프셋에서 분리됨regexec().

내가 이것을 할 때 ...

//

...가장 최근에 정의된 정규식을 사용해야 함을 나타냅니다 sed.regexec()미리 컴파일된 정규식을 다시 재사용하되, 이번에는 변경된 정규식에 적용할 수도 있습니다.새로운 것을 보여주거나 적용하다성냥매개 변수는 내 명령에 따릅니다.

더 구체적으로...

  • s/[^ ]* */[&]P/
    • 첫 번째 항목 바꾸기무늬패턴 공간에서는 [왼쪽 대괄호가 먼저 오고 그 다음에는 오른쪽 대괄호 &, ]오른쪽 대괄호, P문자가 옵니다.
  • s//&+pc/3
    • 마지막으로 사용된 정규식을 현재 패턴 공간에 다시 적용하여 3세 번째 발생 항목을 대체합니다.무늬패턴 공간에서 &자체 뒤에 추가 문자열이 옵니다.+pc.

따라서 모든 sed입력 줄에 대해 표준 출력에 기록하고 예제 데이터를 제공합니다.

[2015-01   ]P5000   1000+pc
[2015-02   ]P6000   2000+pc
[2015-03   ]P7000   3000+pc

이상하게 보일 수도 있지만 dc계산기는 다음과 같이 인용합니다.대괄호 사이의 입력에서 P명령은 줄바꿈을 추가하지 않고 스택의 상단을 인쇄한 \n다음 입력 스택에서 팝합니다.

따라서 dc첫 번째 줄을 예로 들어 보겠습니다.

  • [2015-01 ]P
    • P스택 상단 인쇄 및 팝업
  • 5000
    • 숫자를 5000스택의 맨 위로 밀어넣고 현재 스택에 있는 모든 요소를 ​​밀어넣습니다.(지금은 이용할 수 없음)한 지점 아래로.
  • 1000
    • 위와 동일하지만 이번에는 메인 스택 상단의 숫자 5000이 1만큼 아래로 푸시되어 스택의 두 번째 요소가 됩니다.
  • +
    • 스택 맨 위에 있는 두 숫자를 더하고, 스택에서 두 숫자를 팝하고, 그 합계를 스택 맨 위에 푸시합니다.
    • 그러면 숫자만 포함된 스택이 생성됩니다 6000.
    • 스택 맨 위에 있는 두 요소 중 하나가 [string 인 경우 ]이는 구문 오류입니다.
  • p
    • p스택의 맨 위를 인쇄한 다음 \n스택에서 튀어나오지 않고 추가된 ewline을 인쇄합니다.
  • c
    • c스택 이해

관련 정보