두 파일을 병합하고 두 파일의 두 번째 열을 추가하고 싶습니다.
파일 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