2개의 파일이 있습니다.
파일 1은 다음과 같습니다.
burnj01,Joe Burns
steves02,Santosh Steve
파일 2는 다음과 같습니다.
burnj01,0001
burnj01,0002
burnj01,0010
burnj,0100
burnj01,2000
steves02,2048
steves02,2049
steves02,2091
나는 다음과 같은 파일 3을 원합니다 :
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,0100
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091
첫 번째 파일의 col1을 사용하여 두 파일을 결합하고 일치하면 File2의 열 2 값을 File1의 마지막 열에 추가하고 싶습니다.
나는 이것을 시도했습니다 :
$ awk 'FNR==NR{a[$1]=$2;next} {print $1,$2,a[$1]}' file2 file1 > file3
그러나 이것은 작동하지 않습니다. 어떻게 이를 달성할 수 있나요?
답변1
필드 구분자를 지정 FS
하고 OFS
이를 출력 필드 구분자로 사용해야 합니다.
awk 'BEGIN { FS=OFS="," }
NR==FNR { saving[$1]=$2; next }
($1 in saving){ print $1, saving[$1], $2 }' file1 file2
답변2
코드에는 두 가지 주요 문제 가 있습니다 awk
.
awk
필드 구분 기호 로 사용하도록 지정하지 않았습니다,
. 를 사용하여 이 작업을 수행할 수 있습니다-F ,
.$1
키가 배열에 있는지 여부는 테스트하지 않습니다a
.$1 in a
마지막 코드 블록 이전의 조건으로 이 작업을 수행 할 수 있습니다 . 두 번째 파일의 모든 이름을 첫 번째 파일에 표시하고 싶지만 이에 대해 아무 말도 하지 않으려면 이 단계를 건너뛸 수 있습니다.
또한 예상 출력과 비교하여 잘못된 순서로 필드를 출력하는 것으로 보이며 쉼표( OFS = ","
또는 이 문제를 해결해야 하는 OFS = FS
블록 ) 대신 공백인 기본 출력 구분 기호를 사용하고 있습니다.BEGIN
$ awk -F , 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 }' file1 file2
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091
$ join -t, <( sort file1 ) <( sort file2 )
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091
이렇게 하면 두 파일이 모두 정렬되고 정렬된 내용이 join
유틸리티에 전달됩니다. 이 join
유틸리티는 기본적으로 첫 번째 열의 두 데이터세트 간에 관계형 JOIN 작업을 수행합니다. 이는 INNER JOIN
SQL에 익숙하다면 기본적으로 JOIN입니다. 열이 쉼표로 구분되어 있음을 알리기 위해 -t ,
with를 사용합니다 .join
쉘이 <( ... )
프로세스 대체를 이해하지 못하는 경우 데이터를 사전 정렬하십시오. 이 join
유틸리티에는 정렬된 입력이 필요합니다.
sort -o file1.sorted file1
sort file2 | join -t, file1.sorted -
rm -f file1.sorted
답변3
가입 방법은 다음과 같습니다.
join -t, <(sort file1) <(sort file2)