파일 내의 숫자/카운터를 기준으로 정렬하고 연결하는 방법은 무엇입니까?

파일 내의 숫자/카운터를 기준으로 정렬하고 연결하는 방법은 무엇입니까?

파일에 있는 번호를 기준으로 두 개의 파일, 즉 동일한 번호의 두 파일을 연결하고 싶습니다.

Toyota   model1 
BMW      model2
Benz     model3
BMW      model4 
BMW      model5
Benz     model6 
Benz     model7

그리고 두 번째 파일

class C    model1
class E    model2
class A    model3
class W    model4
class W    model5
class C    model6
class A    model7

이렇게 숫자를 기준으로 두 개의 파일을 연결하고 각 모델을 하나의 파일로 연결하고 싶습니다.

Toyota      class C  model1
BMW         class E  model2
Benz        class A  model3
BMW         class W  model4 
BMW         class W  model5  
Benz        Class C  model6
Benz        Class A  model7

나중에 "모델" 문자열을 제거하세요.

내 코드,

sort -V file1 > new_file1 
sort -V file2 > new_file2 
join newfile1 new_file2 > result.txt
sed 's/model[(1-9)]//g' result.txt > result_1.txt

문제파일을 결합하는 동안 오류가 발생합니다.

join: file1.txt:10: is not sorted: 03Benz   model   249
join: file2.txt:4: is not sorted: BMW   model   2

그 이후에 빈도를 계산하고 싶다면 어떻게 해야 할까요?

   ( this pair happen in the text 2 times) after joined 
Toyota      class C  1
BMW         class E  1
Benz        class A  2
BMW         class W  2
Benz        Class C  1

답변1

사용 join.

파일의 첫 번째 공백 문자를 공백이 아닌 다른 문자로 변경하면 파일을 공백으로 구분된 레코드로 변환하기에 충분한 것 같습니다.

%다음은 첫 번째 공백을 각 파일의 두 번째 열로 바꾼 다음 연결하는 구현입니다 .

$ cat file2 | sed -e 's/ /%/' | join -1 2 -2 2 - file1

또는

$ <file2 sed -e 's/ /%/' | join -1 2 -2 2 - file1

생산하다

model1 class%C Toyota
model2 class%E BMW
model3 class%A Benz
model4 class%W BMW
model5 class%W BMW
model6 class%C Benz
model7 class%A Benz

탭으로 구분된 형식으로 변환해야 하는 경우 를 사용할 수 있습니다 tr.

tr ' %' '\t ' 

답변2

Join은 올바른 도구이므로 파일 정렬 외에는 다른 변환이 필요하지 않습니다.

join -12 -23 -o 1.1 2.1 2.2 0 file1 file2 |column -t
Toyota  class  C  model1
BMW     class  E  model2
Benz    class  A  model3
BMW     class  W  model4
BMW     class  W  model5
Benz    class  C  model6
Benz    class  A  model7

Join은 기본적으로 공백으로 구분된 필드를 처리합니다.
옵션 -12는 첫 번째 파일의 두 번째 필드를 나타냅니다.
옵션 -23은 두 번째 파일의 세 번째 필드를 나타냅니다.
옵션 -o는 출력 형식을 나타냅니다.
1.1 = file1 field 1
2.1 = file2 field 1
0 = 공통/연결 필드

올바른 정렬 및 올바른 연결을 보장하려면 정렬 및 연결 명령 앞에 LC_ALL=C를 적용합니다(예: LC_ALL=C 정렬 파일).

계산 부분과 관련하여 다음을 수행할 수 있습니다.

join -12 -23 -o 1.1 2.1 2.2 0 file1 file2 |cut -d' ' -f1-3 |sort |uniq -c
      1 BMW class E
      2 BMW class W
      2 Benz class A
      1 Benz class C
      1 Toyota class C

여기에서 위의 테스트를 모두 온라인으로 볼 수 있습니다.

관련 정보