다른 텍스트 파일에서 텍스트 파일 만들기

다른 텍스트 파일에서 텍스트 파일 만들기

이런 텍스트 파일이 있어요

word_1 root_of_word_A
word_2 root_of_word_B
word_3 root_of_word_C
word_4 root_of_word_A

및 기타 유사한 파일

root_of_word_A root_of_word_1
root_of_word_B root_of_word_2
root_of_word_C root_of_word_3

아래와 같이 첫 번째 문서의 다른 단어를 두 번째 문서의 다른 단어로 바꿔야 합니다.

word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

awk를 사용하면 이런 일을 할 수 있을 것 같아요. 나는 이것을 시도했습니다 :

awk 'NR==FNR {print $1}{c[$2]++;next};c[$1]>0{print $2}' file1 file2

문제는 file1의 첫 번째 열과 file2의 두 번째 열을 인쇄하는 방법을 모른다는 것입니다.

첫 번째 파일과 두 번째 파일의 줄 수가 서로 다르다고 언급되었으며, 내가 하려는 작업을 더 명확하게 하기 위한 예가 있습니다(문제는 A를 1로 변환하는 것이 아니라 전체 root_of_the_word를 변환하는 것입니다).

답변1

의 단어 file2가 고유한 경우 파일 순서를 반대로 바꾸고 배열을 만든 다음 다음 file2에 적용할 수 있습니다 file1.

$ awk 'NR==FNR{a[$1]=$2;next}{print $1,a[$2]}' file2 file1
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

답변2

관계형 조인 작업을 수행하고 있습니다. 이를 수행하는 표준 Unix 명령이 있습니다: join.더 많은 사람들이 이 훌륭한 도구에 대해 알았으면 좋겠습니다!

join명령은 공통 필드에 있는 두 파일을 연결합니다. 그러나 두 파일 모두 이 필드에서 정렬되어야 합니다.

공통 필드는 첫 번째 파일의 필드 2( ) file1.txt와 두 번째 파일의 필드 1( ) 입니다 file2.txt. 다음 필드를 기준으로 파일을 정렬합니다.

$ sort -k2,2 -o file1.txt file1.txt
$ sort -k1,1 -o file2.txt file2.txt

그런 다음 이 필드에 대해 조인을 수행하고(설명서를 읽으십시오 join) 첫 번째 파일의 필드 1과 두 번째 파일의 필드 2만 출력으로 지정하고 결과를 정렬합니다(필요한 경우).

$ join -1 2 -2 1 -o 1.1,2.2 file1.txt file2.txt | sort
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

관련 정보