가지고 있는 두 개의 파일을 병합해야 하는데, 병합하기 전에 먼저 파일이 일치해야 합니다. 이것은 내 첫 번째 파일이며 100만 줄이 포함되어 있습니다.
abcde
fghi
jklmn
opqrs
123456
0000
두 번째 파일에는 300만 줄이 포함되어 있지만 여전히 첫 번째 파일의 문자열이 포함된 일부 줄이 있습니다.
543123:fdfdss
dfskld:533fg
abcde:1234
fdskls:fkdfs
gfdkls:flfds
0000:5432
fdsk:saakl
산출:
abcde:1234
fghi
jklmn
opqrs
123456
0000:5432
출력이 file1:file2가 되기를 원하지만, 이는 file2의 첫 번째 열과 file1의 문자열과 일치하는 경우에만 가능합니다. 정렬 형식을 엉망으로 만들고 싶지 않고 이 순서로 정렬하고 싶고 file1 문자열을 유지하면서 일치하는 문자열만 추가하고 싶습니다.
답변1
쉬운 방법은 awk
두 번째 파일을 읽고 각 줄을 배열(인덱스는 $1)에 저장한 다음 첫 번째 파일을 읽을 때 해당 줄이 이미 배열의 인덱스인지 확인하는 것입니다. 그렇다면 해당 줄을 다음으로 바꾸십시오. 해당 요소의 값:
awk -F: 'NR==FNR{z[$1]=$0;next}
($0 in z) {$0=z[$1]};1' file2 file1
이 작업을 수행할 수도 있지만 더 많은 작업이 필요합니다(기본적으로 결과를 정렬 하고 순서를 복원 join
하려면 첫 번째 파일의 줄에 번호를 매깁니다 ).join
join -a 1 -t: -1 2 -2 1 <(nl -s: -ba -nrz file1 | sort -t: -k2,2) \
<(sort -t: -k1,1 file2) | sort -t: -k2,2 | cut -d: -f1,3-