다음과 같은 파일이 있습니다
파일 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 ,
)로 사용하세요.