파일 텍스트를 다시 쓰려고 합니다.메인파일.txt다음에서 변경변경.txt. 이것메인파일.txt파일은 다음과 같습니다.
word_1 genre_A
word_2 genre_A
word_3 genre_B
word_4 genre_C
word_5 genre_A
게다가변경.txt다음과 같습니다:
genre_A root_A
genre_C root_C
내용을 변경하고 싶어요변경.txt존재하다메인파일.txt다음과 같은 것을 얻으십시오 :
word_1 root_A
word_2 root_A
word_3 genre_B
word_4 root_C
word_5 root_A
이 파일은 매우 커서 자동 방법이 필요합니다.
모든 변수를 로드하려고 합니다.변경.txt배열 을 넣고 awk
다르면 같은 내용을 인쇄하고, 같으면 변경합니다. 이 같은:
NR==FNR{a[$1,$2]++;next} $3==a[$1] {print $1,$2,a[$2]} $3!=a[$1] {print $1,$2,$3}
하지만 내가 뭔가 잘못했어요. 명령어로도 가능하다고 들었는데 join
익숙하지 않아서 각 부분에 대한 설명을 해주시면 도움이 될 것 같습니다.
다들 감사 해요.
답변1
명령 을 언급했지만 join
이 경우에는 사용하기가 쉽지 않습니다. 적어도 그 자체로는 그렇지 않습니다.
이 두 파일을 결합해 보겠습니다. 이렇게 하려면 먼저 조인 필드에서 파일을 정렬해야 합니다. 첫 번째 파일의 두 번째 필드와 두 번째 파일의 첫 번째 필드를 사용합니다 join
(기본값).
$ sort -k2 -o main.txt main.txt
$ sort -k1 -o changes.txt changes.txt
그런 다음 연결합니다.
$ join -1 2 main.txt changes.txt
genre_A word_1 root_A
genre_A word_2 root_A
genre_A word_5 root_A
genre_C word_4 root_C
우리는 줄을 놓쳤습니다. 다시 시도하고 무시될 줄 join
도 출력하도록 지시하십시오 ( 에서 아무것도 일치하지 않기 때문입니다 ).main.txt
changes.txt
$ join -1 2 -a 1 main.txt changes.txt
genre_A word_1 root_A
genre_A word_2 root_A
genre_A word_5 root_A
word_3 genre_B
genre_C word_4 root_C
join
원하는 출력의 두 번째 열에는 두 파일의 데이터가 혼합되어 있으므로 두 파일 중 특정 열만 출력하도록 요구할 수는 없습니다 .
그러나 위의 출력을 사용하면 간단한 스크립트를 사용하여 마지막 두 열을 추출할 수 있습니다 ( 오른쪽에서 열을 가져오려면 음수 필드 사양을 채택할 수 있었으면 awk
좋겠습니다 !).cut
$ join -1 2 -a 1 main.txt changes.txt | awk '{ print $(NF-1), $NF }'
word_1 root_A
word_2 root_A
word_5 root_A
word_3 genre_B
word_4 root_C
정렬 되도록 파이프하십시오 sort
.
$ join -1 2 -a 1 main.txt changes.txt | awk '{ print $(NF-1), $NF }' | sort
word_1 root_A
word_2 root_A
word_3 genre_B
word_4 root_C
word_5 root_A
답변2
앗주문하다:
awk 'NR==FNR {a[$1]=$2;next} {if ($2 in a) print $1,a[$2]; else print $1,$2}' changes.txt main.txt
산출:
word_1 root_A
word_2 root_A
word_3 genre_B
word_4 root_C
word_5 root_A
답변3
유형그리고가입하다(하지만앗) 방법:
sort -k2 main.txt > main_sort.txt ; \
sort -k1 changes.txt > changes_sort.txt ; \
{ join -i -1 2 -2 1 -o 1.1 2.2 main_sort.txt changes_sort.txt ; \
join -v 1 -i -1 2 -2 1 -o 1.1 1.2 main_sort.txt changes_sort.txt ; } | \
sort -g | column -t
산출:
word_1 root_A
word_2 root_A
word_3 genre_B
word_4 root_C
word_5 root_A
설명하다...
join
정렬 필드가 있는 두 개의 파일이 필요합니다. 각 파일은 크기가 크고 두 번 사용해야 하므로 미리 두 파일을 모두 정렬하는 것이 더 효율적입니다. 모든 파일이 다음과 같다고 가정합니다.상표구분됨.
유형메인파일.txt의지하다2위분야(장르), 그리고변경.txt의지하다처음필드(루트):
sort -k2 main.txt > main_sort.txt
sort -k1 changes.txt > changes_sort.txt
첫 번째 패스에서는 일치하는 라인을 출력합니다.
join -i -1 2 -2 1 -o 1.1 2.2 main_sort.txt changes_sort.txt
4줄 출력, 를 누르세요뿌리대지:
word_1 root_A
word_2 root_A
word_5 root_A
word_4 root_C
join
깃발"-1 2 -2 1"말해가입하다이것처음기록한 것두번째도착하다2위기록한 것첫 번째대지. 배너"-o 1.1 2.2"말해인쇄이것처음기록한 것첫 번째도착하다2위기록한 것두번째대지.
2로 사용"-v 1"출력에서 누락된 행에 플래그 지정첫 번째문서:
join -v 1 -i -1 2 -2 1 -o 1.1 1.2 main_sort.txt changes_sort.txt
산출:
word_3 genre_B
그 후 두 출력이 결합된 다음 정렬됩니다(답변 상단 참조).