배열을 행렬로 결합 - 셀 사이에 구분 기호 추가

배열을 행렬로 결합 - 셀 사이에 구분 기호 추가

두 파일을 병합하고 두 파일의 두 번째 열을 추가하고 싶습니다.

파일 1.

001    A
002    B
003    C
004    D

파일 2.

002    D
003    D
005    E
006    F

아래와 같이 파일 3에 병합되어야 합니다.

001    A
002    B D
003    C D
004    D
005    E
006    F

나는 andreatsh가 제안한 이 명령을 시도했습니다.AWK를 사용하여 두 파일을 병합하고 두 번째 열을 추가합니다.:

$ awk '{ z[$1]=z[$1]$2 } END { for (i in z) print i, z[i] }' file1  file2
002 BD
003 CD
004 D

등...

꽤 비슷하지만 글자 사이에 공백을 추가하려면 어떻게 해야 합니까?

예를 들어 첫 번째 줄에 "BD"를 사용하는 대신 "BD"를 사용합니다.

답변1

예, Awk를 사용하여 수행할 수 있지만 이 작업을 위해 Join이 만들어졌습니다.

join -a1 -a2 file1 file2

특정 샘플의 출력:

001 A
002 B D
003 C D
004 D
005 E
006 F

를 실행하기 전에 파일을 정렬해야 합니다 join. 쉘이 이를 지원하는 경우 다음 명령을 사용하여 한 단계로 수행할 수 있습니다.프로세스 교체:

join -a1 -a2 <(sort file1) <(sort file2)

답변2

올바른 도구는 join실제로콰지모도가 보여주듯이, 그러나 약간의 수정을 거쳐 동일한 awk 명령을 사용할 수도 있습니다.

$  awk '{ z[$1]=z[$1]" "$2 } END { for (i in z) print i, z[i] }' file1  file2
002  B D
003  C D
004  D
005  E
006  F
001  A

방금 z[$1]=z[$1]$2으로 바꿨습니다 z[$1]=z[$1]" "$2.

답변3

004 D테스트할 불분명한 사례가 있도록 file2에 추가했습니다 . 이를 고려하면 다음 중 하나입니다.

$ sort -k1,1 -s file1 file2 |
awk '
    $1 != prev { if (NR>1) print ""; printf "%s", $1; prev=$1 }
    { printf " %s", $2 }
    END { print "" }
'
001 A
002 B D
003 C D
004 D D
005 E
006 F

아니면 이거:

$ sort -k1,1 -s file1 file2 |
awk '
    $1 != prev{if (NR>1) print ""; printf "%s", $1; prev=$1; delete seen }
    !seen[$2]++ { printf " %s", $2 }
    END { print "" }
'
001 A
002 B D
003 C D
004 D
005 E
006 F

동일한 키에 대한 중복 값을 어떻게 처리할지에 따라 다릅니다. 원하는 만큼 파일을 나열하면 됩니다 sort. 위의 내용은 GNU 정렬이 -s동일한 키의 입력 순서를 유지한다고 가정합니다. 해당 순서가 없고 실제로 필요한 경우 간단한 대안이 있습니다. 원하는 경우 ABC 등이 각 입력 파일에 나타나는 순서가 아닌 항상 각 출력 줄에서 알파벳 순서로 표시되도록 간단한 조정을 수행할 수도 있습니다. 예를 들면 다음과 같습니다.

$ head file*
==> file1 <==
001    A
002    E
003    F
004    D

==> file2 <==
002    D
003    D
004    D
005    E
006    F

==> file3 <==
001    A
002    E
003    C
004    D

$ sort -s file* | awk '$1 != prev{if (NR>1) print ""; prev=$1; delete seen; printf "%s", $1} !seen[$2]++{printf " %s", $2} END{print ""}'
001 A
002 D E
003 C D F
004 D
005 E
006 F

관련 정보