다음 명령을 사용하여 파일 1(100만 줄)과 파일 2(10,000줄)를 새 파일 3(100만 줄이어야 함) awk
에 결합하고 싶습니다.
파일 1:
471808241 29164840 1 10001 156197396
471722917 21067410 1 31001 135961856
471941441 20774160 1 7001 180995072
471568655 29042630 1 15001 157502996
471524711 20716360 1 4001 180226817
471873918 29583520 1 2001 128567298
471568650 29042631 1 15002 157502910
파일 2
610146 156197396
531101 135961856
704011 180226817
502216 128567298
707012 180995072
615246 157502996
685221 157502910
원하는 출력:
471808241 29164840 1 10001 156197396 610146
471722917 21067410 1 31001 135961856 531101
471941441 20774160 1 7001 180995072 707012
471568655 29042630 1 15001 157502996 615246
471524711 20716360 1 4001 180226817 704011
471873918 29583520 1 2001 128567298 502216
471568650 29042631 1 15002 157502910 685221
답변1
이 두 파일을 결합하고 싶습니다.
join
따라서 파일을 키 순서대로 정렬한 후 다음 명령을 사용하십시오.
sort -b -k 5 파일 1 > 파일 1 정렬 정렬 -b -k 2 파일 2 > 파일 2 정렬 Join -1 5 -2 2 -o 1.1,1.2,1.3,1.4,2.2,2.1 파일 정렬 1 파일 정렬 2
추가 읽기
- "유틸리티: 가입". 쉘 명령 언어. 단일 UNIX 사양. 이슈 7. IEEE 1003.1. 2016. 그룹을 엽니다.
답변2
$ awk 'NR==FNR{a[$2]=$1; next} {sub(" ?$"," "a[$5]); print}' file2 file1
471808241 29164840 1 10001 156197396 610146
471722917 21067410 1 31001 135961856 531101
471941441 20774160 1 7001 180995072 707012
471568655 29042630 1 15001 157502996 615246
471524711 20716360 1 4001 180226817 704011
471873918 29583520 1 2001 128567298 502216
471568650 29042631 1 15002 157502910 685221
NR==FNR
현재 줄 번호가 파일 줄 번호와 동일한 경우 첫 번째 파일 인수에만 적용됩니다.file2
a[$2]=$1; next
나머지 코드를 건너뛰기file2
위해 행의 키-값 쌍을 저장합니다.next
sub(" ?$"," "a[$5])
줄 끝의 선택적 공백을a
다섯 번째 열을 키로하여 배열의 공백과 값으로 바꾸려면 바꾸기를 사용하십시오.print
그런 다음 수정된 입력 줄을 인쇄합니다.file1
답변3
10,000개의 키에서 백만 번 조회를 수행하고 성능이 필요한 경우 Perl을 사용하십시오.
#!/usr/bin/perl
# create hash from file2
($f2) = pop @ARGV;
%hash = map { reverse split } do { local @ARGV=($f2); <>};
# loop over file1
while ( <> ) {
chomp;
@F = split;
print "$_ $hash{$F[4]}\n";
}
답변4
진주
perl -lpe '
BEGIN{ %h = do{local(@ARGV,$/)=pop;<>} =~ s/^(\s*\d+)(\s\d+)$/$2 $1/mgr =~ //mg;
$_ .= $h{(/(\s\d+)$/)[0]};
' File1 File2
불다
while read -r value key; do eval "_h_$key='$value';"; done < File2
while read -r _1 _2 _3 _4 _5; do
eval "x=\$_h_$_5"
printf '%s ' "$_1" "$_2" "$_3" "$_4" "$_5"
echo "$x"
done < File1
옆
echo '.' >> File2
sed -e '
1{
:file2
N
/\n\.$/!bfile2
H;d
}
G
s/\([ ][0-9][0-9]*\)\n.*\n\([0-9][0-9]*\)\1\n.*/\1 \2/
' File2 File1