파일 내용: File1
1 a
2 b
3 c
...
-----파일 2
2 a
2 c
2 d
...
awk는 쉼표로 구분된 다음 형식을 허용합니다.
1 a,2 a
2 b,2 c
...
paste -d, File1 File2 | awk -F, '{n=NF/2;s=""; for (i=1;i<=n;i++){printf "%s%s", s, ($i-$(i+n));s=",";}; print ""}'
나는 이 줄을 사용하여 첫 번째 필드에 대해 한 줄씩 차이를 냅니다. 첫 번째 줄은 1-2이므로 -1을 인쇄합니다.
좋아요, 괜찮아요. 정답을 얻었지만 필드가 -F로 구분될 때 숫자 필드를 어떻게 선택하는지 아직도 이해가 안 돼요.
1 a
내가 변하면
1 a
도착하다
a 1
나머지 부분과 동일한 작업을 수행하면 작동하지 않습니다. 논리적으로 동의합니다. 즉, 필드가 숫자와 문자인 경우 어떻게 숫자를 얻습니까? $i = 숫자, 문자는 왜 안 되나요?
답변1
필드가 숫자와 문자인 경우 어떻게 숫자를 얻나요?
,
필드 구분 기호( ) 인 경우 -F,
유사한 텍스트 2 a
는 단일 필드이며, 숫자로 사용되는 경우 단순히 숫자 2로 처리됩니다.
AWK 언어는 문자열을 숫자로 처리하도록 요청할 때 매우 관대합니다. 더 이상 숫자로 이해되지 않을 때까지 문자열을 읽습니다. 그 시점에서 무엇이든 의미가 있다면 그것은 당신의 전화번호입니다. 그렇지 않으면 0으로 처리합니다. 산술 표현식에 문자열을 사용하면 이 모든 일이 자동으로 발생합니다. 작동 방식을 보려면 다음을 실행하세요.
awk '{print $0 + 0}'
$0
전체 라인입니다. 0을 추가하면 숫자로 해석되지만 숫자가 무엇인지는 변경되지 않습니다. 그런 다음 입력 줄을 입력하여 awk
숫자로 처리되는 방식을 확인할 수 있습니다 . 예를 들어, 빈 문자열은 0, 3a
3, 1 2
1, 3.4.5.6
3.4 등임을 알 수 있습니다. ( Ctrl줄 시작 부분에서 +를 누르면 입력이 종료되고 빠져 나오거나 +를 직접 누르면 됩니다.)Dawk
CtrlC
실제로 수행하려는 작업에 따라 해당 명령이 수행하는 작업과 작동 방식을 보다 명확하게 설명하고 보다 쉽게 수정할 수 있는 간단한 명령을 작성할 수 있습니다.예를 들어, 각 파일에 공백으로 구분된 두 개의 열만 있고 항목 자체에 공백이 포함되어 있지 않은 경우, paste
없이 실행하여 -d
(또는 원하는 경우 유사한 사용 ) 테이블을 4열 테이블로 병합하고 다음 없이 -d ' '
테이블을 파이프하세요 .awk
-F
paste File1 File2 | awk '{print $1 - $3}'
그러면 숫자가 문자 앞이 아닌 뒤에 나타날 때 AWK 스크립트를 조정하는 방법이 분명해집니다.
paste File3 File4 | awk '{print $2 - $4}'
File3
(이를 테스트하려면 토글 열을 사용하여 각각 make 및 File4
from 을 사용할 수 있습니다 File1
. 예를 들어 make .)File2
awk
awk '{print $2, $1}' File1 > File3
File3