두 파일의 다른 모든 줄을 병합합니다.

두 파일의 다른 모든 줄을 병합합니다.

파일 1:

A
B
C 
D

파일 2:

E
F
G
H

출력을 어떻게 얻나요?

A
BF
C
DH

답변1

다음을 수행할 수 있습니다.

paste -d '\n' file1 file2 | sed -n 'p;n;n;N;s/\n//p' > output

paste두 개의 파일을 한 줄씩 교대로 압축하고 sed p첫 번째를 인쇄하고 두 번째를 삭제하고 네 번째를 세 번째에 추가한 다음 연결하고 다음 줄부터 다시 시작합니다.

또는 GNU를 사용하십시오 sed:

paste -d '\n' file1 file2 | sed '2~4d' | paste -sd '\n\0\n' - > output

여기서는 압축된 출력에서 ​​4줄 중 두 번째 sed줄만 d추출한 paste다음 연결을 위해 두 번째로 붙여넣습니다.

아니면 계속 GNU를 사용하세요 sed:

sed 'z;n' file2 | paste -d'\0' file1 - > output

이는 sed한 줄을 압축하고(다른 sed구현에서는 사용할 수 있음 ) ext를 s/.*//가져와 인쇄하여 file1에 붙여넣을 수 있습니다.n

답변2

$ awk '{ getline other <"file2" } { print $0 (FNR % 2 == 0 ? other : "") }' file1
A
BF
C
DH

읽은 각 줄 에 대해 file1awk스크립트는 또한 그 줄에서 한 줄을 읽고 file2이를 변수에 저장합니다 other. 그런 다음 file1변수와 연결된 줄을 인쇄하고 other줄 번호가 홀수이면 아무것도 인쇄하지 않습니다.


쉘 루프도 같은 일을 할 수 있습니다:

n=0
while IFS= read -r a; do
    n=$(( n + 1 ))

    IFS= read -r b <&3

    [ "$(( n % 2 ))" -ne 0 ] && b=""
    printf '%s%s\n' "$a" "$b"
done <file1 3<file2

이 루프는 file1각 줄을 읽어들이고, 각 반복은 $a(파일 설명자 3을 통해)에서 (파일 설명자 3을 통해)까지 한 줄을 읽으며 반복됩니다. 지금까지 읽은 행 수가 홀수인 경우 빈 문자열로 설정됩니다. 그런 다음 둘 다 인쇄하십시오.file2$bfile1$b$a$b


paste및 GNU 를 사용 sed하고 두 파일 모두 탭이 없다고 가정합니다(질문에 나와 있지 않으므로).

paste file1 file2 | sed '1~2s/\t.*//;s/\t//'

paste두 파일의 내용이 탭으로 구분되어 나란히 생성됩니다 . 이 sed표현식은 먼저 홀수 줄의 탭 문자로 시작하는 모든 항목을 제거한 다음 나머지 탭 문자를 모두 제거합니다.

동일한 가정에서 sed위의 전체 명령을 다음으로 바꿀 수 있습니다 awk.

paste file1 file2 | awk -F '\t' '{ print $1 (FNR % 2 == 0 ? $2 : "") }'

답변3

사용

awk 'NR==FNR {a[NR]=$0;next} FNR%2==0 { a[FNR]=a[FNR]$0}  END{for ( i in a) print a[i]}' file1 file2

예를 들어

#!/bin/bash
echo "a
B
C
D" > file1
echo 'aa
Gd
Er
Yu
Ee
Tt' > file2
awk 'NR==FNR {a[NR]=$0;next} FNR%2==0 { a[FNR]=a[FNR]$0}  END{for ( i in a) print a[i]}' file1 file2

당신은 출력을 얻을 것이다

a
BGd
C
DYu
Tt

답변4

를 사용하여 GNU sed다음을 수행할 수 있습니다.

sed -e 'R file2' file1 | sed -Ee 'N;N;N;s/\n.*(\n.*)\n/\1/'

여기에서 우리는 pastevia를 시뮬레이션한 sed다음 4개의 라인을 함께 묶고 라인 2가 제거되고 라인 3과 4 사이의 개행 문자가 제거되는 방식으로 수행합니다. 다음 4열 슬롯에도 이 과정을 반복합니다.

관련 정보