두 파일의 두 필드 연결

두 파일의 두 필드 연결

t1.txt와 이라는 두 개의 파일이 있습니다 t2.txt. 내용은 다음과 같습니다.

t1.txt

a
b
c

t2.txt

ab
bc
cd

이제 t3.txt가 다음과 같이 보이도록 이 두 파일을 한 줄씩 t3.txt에 병합하려고 합니다.

t3.txt

aab
bbc
ccd

쉘 스크립트를 사용하여 출력을 얻는 데 도움을 주십시오.

답변1

붙여넣고 sed

더 효율적인 방법이 있지만 여기에 paste및 를 사용하는 빠르고 더러운 방법이 있습니다 sed.

$ paste -d":" t1.txt t2.txt | sed 's/://g'
aab
bbc
ccd

두 파일은 아래와 같이 위에서 연결됩니다.

a:ab
b:bc
c:cd

그리고 sed삭제되었습니다 :.

그냥 붙여넣기

사용을 포기할 수 있습니다. 파일을 결합할 때 sed구분 기호로 아무 것도 사용하지 말라고 말하는 것은 약간 중복됩니다 .paste

$ paste -d "" t1.txt t2.txt
aab
bbc
ccd

awk다음 방법을 사용하여 이를 수행할 수도 있습니다 .

$ awk 'NR==FNR{a[FNR]=$0;next} {print a[FNR] $0}'  t1.txt t2.txt
aab
bbc
ccd

이것은 첫 번째 파일을 반복하여 t1.txt배열에 저장합니다 a[FNR]. FNR파일에 있는 각 줄의 줄 번호를 기반으로 하는 배열에 대한 인덱스 입니다 t1.txt. 그런 다음 두 번째 파일을 반복 t2.txt하고 두 번째 파일에 해당하는 첫 번째 파일의 줄을 인쇄합니다.

연결(&A)&nl

이 방법은 약간 복잡하지만 효과가 있고 사용 시 무거운 물건을 들어올리는 awk일이 덜 복잡해집니다.

$ join <(nl t1.txt) <(nl t2.txt)|awk '{print $2 $3}'
aab
bbc
ccd

다음 nl ...명령은 줄 번호가 포함된 테스트 파일 버전을 생성합니다.

$ nl t1.txt 
     1  a
     2  b
     3  c

그런 다음 명령 join은 해당 줄 번호를 두 파일에 공통된 데이터 조각으로 사용하여 결합할 수 있습니다.

$ join <(nl t1.txt) <(nl t2.txt)
1 a ab
2 b bc
3 c cd

awk마지막으로 위의 두 번째 및 세 번째 열을 추출하는 데 사용합니다.

홍보와 awk

거의 사용되지 않는 이 pr명령은 병합 스위치를 통해 파일을 연결하는 데에도 사용할 수 있습니다 -m.

$ pr -t -m  t1.txt t2.txt  | awk '{print $1 $2}'
aab
bbc
ccd

답변2

paste -d '\0' t1.txt t2.txt > t3.txt

아니요, 두 파일 사이에 NUL 문자가 포함되어 있지 않습니다.

예, 표준(POSIX)이고 이식 가능하며 가장 효율적입니다.

답변3

추가 텍스트 처리 도구 없이 BASH 셸에서 실행해 보세요.

exec 3< t1.txt
exec 4< t2.txt

while read l1 <&3 && read l2 <&4; do
    echo ${l1}$l2
done > t3.txt

관련 정보