추가 읽기

추가 읽기

다음 명령을 사용하여 파일 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

관련 정보