파일에 있는 번호를 기준으로 두 개의 파일, 즉 동일한 번호의 두 파일을 연결하고 싶습니다.
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