두 파일의 일치하는 열을 병합하거나 기본값을 사용합니다.

두 파일의 일치하는 열을 병합하거나 기본값을 사용합니다.

파일 텍스트를 다시 쓰려고 합니다.메인파일.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.txtchanges.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

그 후 두 출력이 결합된 다음 정렬됩니다(답변 상단 참조).

관련 정보