이런 텍스트 파일이 있어요
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