줄에 맞춰서 붙여넣기

줄에 맞춰서 붙여넣기

그래서 다음과 같은 줄로 구성된 매우 큰 텍스트 파일 2개가 있습니다.

첫 번째:

Robert:Dillain:Other:Other:Other
Julian:Brude:Other:Other:Other
Megan:Flikk:Other:Other:Other
Samantha:Minot:Other:Other:Other
Jesus:Kimmel:Other:Other:Other

두번째:

Sb:Minot:amsen
Jbb:Kimmel:verlin
R:Dillain:bodent
Mb:Flikk:kentin
Jb:Brude:kemin

나는 그것들을 일치시키고 싶다2열(Dillain, Brude 등)을 다음과 같은 줄에 붙여넣습니다.

산출:

Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen
etc...
etc...

나는 sed그것을 사용하는 것을 고려하고 있지만 Unix 기반이라면 무엇이든 좋을 것입니다. 나는 이 일을 스스로 할 수 있는 방법을 찾지 못했습니다.

답변1

이것은 임무처럼 들립니다 join.

join -t":" -o "1.1,1.2,1.3,1.4,1.5,2.1,2.2,2.3" \
   -j 2 <(sort -k2,2 -t: test1) <(sort -k2,2 -t: test2)

산출:

Julian:Brude:Other:Other:Other:Jb:Brude:kemin
Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Megan:Flikk:Other:Other:Other:Mb:Flikk:kentin
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen

분해:

  • -t필드 구분 기호를 다음으로 설정하세요.:
  • -o인쇄 형식 설정
  • -j열 번호 연결2
  • <(sort -k2,2 -t: file)-k두 번째 열을 기준으로 파일을 미리 정렬하고 -t필드 구분 기호를 다음으로 설정합니다.:

답변2

이는 간단한 작업입니다 awk.

awk -F':' -vOFS=':' 'NR==FNR{a[$2]=$0;next}{print $0,a[$2]}' file2 file1

먼저 입력(사용)과 출력(사용)을 :필드 구분 기호로 설정한 다음, 첫 번째 파일()을 처리하는 경우 전체 행을 두 번째 필드로 인덱싱된 테이블 요소에 할당합니다. 다음 파일( )이 처리되면 해당 행을 인쇄하고 )에 저장된 이전 파일의 행을 추가합니다.-FOFSfile2file1a[$2]

답변3

함께 sed라면 다음을 할 수 있습니다:

sed 's|[^:]*:\([^:]*\).*|/^[^:]*:\1:/s/$/:&/;t|' file2 | sed -f - file1

sed... 두 번째 파일을 읽고 sed첫 번째 파일을 두 번째 sed파일의 표준 입력 으로 편집하는 스크립트를 작성하는 프로세스가 필요합니다 . 내가 아는 한, 이와 같은 정규식에 콘텐츠를 그대로 삽입하는 데에는 문제가 없어야 합니다. 입력에 메타 문자가 있을 수 있는 경우 이 사이트에서 메타 문자를 이스케이프 처리하는 방법을 논의하는 답변이 많이 있습니다. 그러나 필요한 경우 다음 사항으로 충분합니다.

sed 's|[]&\./*[]|\\&|g;s|...' ... | sed -f - file1

그래도 같은 이름의 솔루션이 join더 나은 솔루션일 수 있습니다. 이는 sed귀하가 언급한 이후로 이를 수행하는 방법을 보여주기 위한 것입니다.

sed어쨌든 두 번째 적용 가능한 스크립트는 file1다음과 같습니다.(file2의 각 줄에는 다음과 유사한 줄이 있습니다):

/^[^:]*:Dillain:/s/$/:R:Dillain:bodent/;t

...즉, 일치하는 줄이 발견되면딜런콜론으로 구분된 두 번째 필드의 경우 추가해야 합니다.:R:딜런:보덴트꼬리에 끈으로 묶으세요. from 행이 이미 추가된 경우 계속해서 행을 일치시키려는 것이 의미가 없을 수 있으므로 file1후행 est 명령은 완료되자마자 성공적인 대체 항목을 분기합니다.file2t

답변4

통과하다파이썬 3

#!/usr/bin/python3
import csv
import sys
file1, file2 = sys.argv[1], sys.argv[2]
with open(file2) as second, open(file1) as first:
    second_list = second.readlines()
    first_list = first.readlines()
for line1 in first_list:
    for line2 in second_list:
        if line1.split(':')[1] == line2.split(':')[1]:
            print(line1.strip()+line2.strip())

위 스크립트를 복사하여 script.py. 그런 다음 터미널에서 다음 명령을 실행하여 스크립트를 실행합니다.

python3 script.py file1 file2

관련 정보