file1의 숫자를 file2의 해당 줄로 바꿉니다.

file1의 숫자를 file2의 해당 줄로 바꿉니다.

다음과 같은 파일이 있습니다

파일 1

   3 123456789
   3 00000     
   2 123456789
   2 abcde
   1    
   4 abcdefgh

첫 번째 열의 줄은 다음과 같이 다른 파일의 줄 번호와 관련됩니다.

파일 2

$a&a(md
( l 0 p a$1
=2 3 x5 x4
&a”s?m!a

첫 번째 파일의 첫 번째 열에 있는 숫자를 두 번째 파일의 해당 행 내용으로 바꾸어 파일을 융합하는 방법을 원합니다. 따라서 최종 파일은 다음과 같습니다.

산출

=2 3 x5 x4    123456789
=2 3 x5 x4    00000  
( l 0 p a$1   123456789
( l 0 p a$1   abcde
$a&a(md          
&a”s?m!a      abcdefgh

어떤 열이 어떤 열인지 알 수 있는 한 형식은 중요하지 않습니다.

저는 리눅스를 사용하고 있습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

을 사용하여 줄 awk(레코드) 번호로 색인화된 file2에서 배열을 구성한 다음 file1의 첫 번째 필드를 기반으로 검색할 수 있습니다.

$ awk 'NR==FNR {a[FNR]=$0;next} {printf "%s\t%s\n", a[$1], $2}' file2 file1
=2 3 x5 x4  123456789
=2 3 x5 x4  00000
( l 0 p a$1 123456789
( l 0 p a$1 abcde
$a&a(md 
&a”s?m!a    abcdefgh

이 탭은 두 부분으로 구분됩니다. 원하는 경우 쉼표로 구분할 수 있습니다.

답변2

join명령을 사용하여 이를 달성할 수 있습니다. 공통 필드를 기반으로 두 개의 파일을 병합합니다. 다음은 사용 예입니다 bash(가독성을 위해 줄을 끊었습니다).

join -t , \
    <(awk '{ print NR","$0; }' file2.txt | sort -k 1b,1 -t ,) \
    <(awk '{ print $1","$2; }' file1.txt | sort -k 1b,1 -t ,) \
    | cut -d , -f 2- \
    | column -t -s ,

산출:

( l 0 p a$1  123456789
( l 0 p a$1  abcde
=2 3 x5 x4   00000
=2 3 x5 x4   123456789
&a”s?m!a     abcdefgh

몇 가지 설명:

  • 필드와 열을 처리하는 방법을 단순화하기 위한 첫 번째 단계는 구분 기호를 표준화하는 것입니다. 여기서는 ,이런 의미가 사용되었습니다.
  • awk구분 기호를 표준화하는 데 사용됩니다 file1.txt.
  • file2.txt행을 결합할 명시적인 필드가 없으므로 각 awk행에 행 번호를 추가하는 데 사용됩니다 .
  • 기본적으로 join파일은 각 파일의 첫 번째 필드를 사용하여 연결됩니다. 따라서 어떤 필드를 사용해야 하는지 지정할 필요가 없습니다. -t주어진 표현 필드는 로 구분 됩니다 ,.
  • join두 입력 파일 모두 정렬될 것으로 예상되므로 예상된 기본 정렬이 사용되는지 sort확인하는 데 사용됩니다 .join
  • <( some_command )익명의 명명된 파이프를 만듭니다. 기본적으로 명령 출력을 파일로 사용할 수 있습니다.
  • cut출력에서 줄 번호 필드를 제거하는 데 사용됩니다.
  • 마지막으로 column출력을 테이블( -t)로 형식화하는 데 사용됩니다. 에서 오는 데이터가 복잡해지는 것을 방지하려면 file2.txt, ,를 구분 기호( -s ,)로 사용하세요.

관련 정보