여러 파일을 한 줄씩 병합

여러 파일을 한 줄씩 병합

File3에 대해 제공된 지침에 따라 간단한 bash 스크립트(sed? awk?)를 사용하여 File1 및 File2의 행을 새 File4에 복사할 수 있습니까?

 File1: /*two or more columns, tab delimited*/
    AC    456324
    DC    689712
    GH    123677
    KL    236587

File2: /*two or more columns, tab delimited*/
    DC    AABBC TTYJU
    AC    DDDEE YYUKI
    KL    GGHHG QQSSD

 File3: /*one column*/
    AC
    DC

File4 /*tab delimited*/
    AC    456324    DDDEE   YYUKI
    DC    689712    AABBC   TTYJU

저는 실제로 Python 사전을 사용하여 이 작업을 수행하고 있는데 간단한 해결 방법을 알고 계시는지 궁금합니다.

참고: 이 질문에는 이미 가장 간단한 형태의 답변이 있습니다.파일을 한 줄씩 병합

답변1

이것은 배열을 사용하여 연결한 더 간단한 사례의 확장입니다.awk

$ awk 'BEGIN{OFS="\t"} NR==FNR {a[$1]=$1;next;} \
    $1 in a {k=$1;$1="";a[k]=a[k]$0} END{for (i in a) print a[i]}' File3 File1 File2
AC      456324  DDDEE   YYUKI
DC      689712  AABBC   TTYJU

와 달리 join키 필드에 대한 파일을 사전 정렬할 필요가 없습니다.

답변2

명령을 사용하여 공정하게 수행할 수 있습니다 join.

$ join -j 1 <(sort file3) <(sort file1) > tmp ; \
    join -j 1 <(sort tmp) <(sort file2) | sed 's/ /\t/g' > file4
  • 나는 처음으로 join사용한다파일 3그리고파일 1~부터파일 3열쇠가 있습니다.
  • 이제 위 명령의 출력을 다음과 같이 작성합니다.tmp지금 다시 가입하세요tmp그리고 파일 2.
  • 이제 위 명령에 따라 출력이 공백으로 구분된 형식으로 표시됩니다.
  • sed귀하의 요구 사항은 탭으로 구분된 형식이므로 모든 공백을 탭으로 바꾸는 명령 에 제공했습니다 .
  • 마침내 나는 편지를 썼다.파일 4귀하의 요청에 따라.

답변3

"단순함"이 많은 코드를 작성할 필요가 없다는 것을 의미한다면 도구가 많이 있습니다.csvkit또는CSV 수리이에 대해 도움이 되는 내용이 있습니다. 특히 둘 다 제공하는 "join" 하위 명령을 살펴보세요.

그러나 추가 요구 사항이 있을 수 없다는 뜻이라면 "쉬운" 방법은 없다고 생각합니다. 적어도 공허한 얘기는 아닐 것이다.

또한 어쨌든 이것은 bash와 표준 Unix 유틸리티를 사용하여 해결하려는 문제가 아닙니다. 제 생각에는 이런 종류의 경우에는 Python이 좋은 선택입니다. 특히 문제가 더욱 복잡해지면 더욱 그렇습니다.

관련 정보