유사한 질문을 Google과 웹사이트에서 검색해 보았으나 원하는 내용을 찾을 수 없었습니다. 2개의 파일이 있는데 둘 다 숫자로만 채워져 있습니다. FileB의 행을 FileA와 비교하는 방법을 알고 싶습니다. FileB의 행이 FileA에 없으면 무시하면 됩니다. 비교 후 FileA의 특정 데이터만 인쇄하고 싶습니다. 더 자세히 설명하자면 둘 다 이미 숫자로 정렬되어 있습니다.
파일 A:
103445 -630
103572 -638
107586 -133
109754 -466
111900 -643
112699 -371
112991 -17
113863 -175
114189 -691
파일 B:
101191 1136
103184 1322
103445 -210
103572 1424
104618 28
105395 1052
보시다시피 B의 1-2번째 줄은 A의 줄이 아니기 때문에 완전히 무시하고 있습니다. B에서 A의 행의 처음 6자만 저장하고 싶습니다. 그런 다음 실행할 다른 명령이 몇 가지 있지만 이를 수행하는 방법을 알고 있다고 생각합니다. 관련 데이터를 짜내기만 하면 됩니다.
Comm을 사용해 보았지만 실제로는 내가 찾고 있는 솔루션을 제공하지 않습니다...
편집: 다음 단계는 col2의 값이 FileB(abs val)의 해당 값의 절반보다 크거나 같은지 확인하는 것이므로 다른 열 데이터도 유지해야 합니다. 나는 그것들만을 끝까지 간직하고 싶다. 예를 들어, 모든 명령을 실행한 후 이러한 조건과 일치하는 FileA의 col1 데이터만 인쇄해야 합니다. 위의 현재 예에서는 아무것도 인쇄되지 않지만 더 큰 파일에서는 1000줄의 내용이 인쇄됩니다.
답변1
$ join FileA FileB | awk '{ x = $2; y = $3 } y < 0 { y = -y } x >= y/2 { print $1, $2 }'
샘플 데이터가 주어지면 join
이는 다음과 같은 결과를 가져올 것입니다.
103445 -630 -210
103572 -638 1424
첫 번째 열은 조인 필드이고, 두 번째 열은 from 이며 FileA
, 마지막 열은 from 입니다 FileB
. 이 단계에서는 두 개의 파일을 정렬해야 합니다.
그런 다음 코드는 awk
마지막 두 열의 값을 합계로 선택하고 x
음수인 경우 y
이를 무효화합니다 . 처음 두 열을 출력하는 y
경우 (이 열은 에서 제공됨 )x >= y/2
FileA
이 awk
비트는 다음과 같이 단축될 수 있습니다.
awk '$3 < 0 { $3 = -$3 } $2 >= $3/2 { print $1, $2 }'
그러나 $3
나중에 이 값을 출력하기로 결정하면 필요하지 않은 내용이 수정됩니다 $0
.