두 번째 파일의 특정 값을 기반으로 한 파일의 줄을 선택합니다.

두 번째 파일의 특정 값을 기반으로 한 파일의 줄을 선택합니다.

두 개의 파일이 있습니다.

하나는 "total.txt"입니다. 여기에는 두 개의 열이 있습니다. 첫 번째 열은 1부터 20까지의 자연수(지표)이고 두 번째 열은 난수를 포함합니다.

1 321
1 423
1 2342
1 7542
2 789
2 809
2 5332
2 6762
2 8976
3 42
3 545
... ...
20 432
20 758

다른 하나는 "index.txt"입니다. 4개의 열이 있습니다: (1. 지표, 2: 낮은 값, 3: 높은 값, 4: 지역 이름)

1 400 5000 R1
2 600 800 R2
2 4000 8000 R3
11 300 4000 R4

첫 번째 열이 "index.txt" 파일의 첫 번째 열과 일치하는 "total.txt" 파일의 행을 출력하고 싶습니다. 동시에, 출력 결과의 두 번째 열은 "index.txt"의 두 번째 열보다 크고(>) "index.txt"의 세 번째 열보다 작아야(<) 합니다. 그리고 반드시 지역명을 함께 기재해야 합니다.

예상되는 결과는 다음과 같습니다.

1 423 R1
1 2342 R1
2 809 R2
2 5332 R3
2 6762 R3
11 ... R4
11 ... R4

나는 이것을 시도했습니다 :

awk 'FNR == NR { low[$1]=$2; high[$1]=$3; reg[$1]=$4; next} 
     $2 >= low[$1] && $2 <= high[$1] {print $0,reg[$1]}' index.txt total.txt > result.txt

결과는 다음과 같습니다(R2 영역이 누락됨).

1 423 R1
1 2342 R1
2 5332 R3
2 6762 R3
11 ... R4
11 ... R4

나에게 설명하고 대처 방법을 알려주실 수 있나요? 감사합니다!

실제로 결과가 서로 다른 영역에 따라 출력될 수 있으면 더 좋을 것입니다. 즉, 이 예에서는 서로 다른 영역(R1.txt, R2.txt, R3.txt 및 R4)을 포함하는 4개의 텍스트 파일을 생성하는 것이 가장 좋습니다. .txt). 감사해요!

답변1

두 입력 파일(첫 번째 열)의 표시기는 고유하지 않으므로 키로 사용하기 어렵습니다. 그러나 영역 ID가 고유한 경우 다음을 사용할 수 있습니다.

 $ awk 'FNR == NR { reg=$4; low[reg]=$2; high[reg]=$3; ind[reg]=$1; next} 
  { for (reg in ind) { 
      if ($1 == ind[reg] && $2 >= low[reg] && $2 <= high[reg]) {
         print $0,reg
      } } }' index.txt total.txt
1 423 R1
1 2342 R1
2 789 R2
2 5332 R3
2 6762 R3

이것은 기본적으로 영역을 표시기에 매핑하고 두 번째 파일의 어떤 줄이 일치하는지 확인하기 위해 for 루프가 추가된 코드입니다.

2 789 R2( vs 의 경우 2 809 R2제한이 600과 800이면 왜 809를 인쇄해야 하는지 잘 모르겠습니다.)

print $0,reg > reg ".txt"zone별로 이름이 지정된 파일로 출력되도록 인쇄 명령을 변경합니다 .

관련 정보