다음 형식의 파일이 있습니다.
$ 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
여러 가지 방법이 있습니다:
또 다른 awk 방법
awk '{$2+=$3;}NF--' file
펄
perl -lane 'print "$F[0] ",$F[1]+$F[2]' file
또는
perl -ape 's/$F[1].*/$F[1]+$F[2]/e' file
셸(위보다 훨씬 느리거나 효율성이 떨어짐)
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
명령 구문의 예측 가능한 적용을 보장합니다 .sed
API 구문예를 들어 이 경우 /
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
스택 이해