파일 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
읽은 각 줄 에 대해 file1
이 awk
스크립트는 또한 그 줄에서 한 줄을 읽고 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
$b
file1
$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/'
여기에서 우리는 paste
via를 시뮬레이션한 sed
다음 4개의 라인을 함께 묶고 라인 2가 제거되고 라인 3과 4 사이의 개행 문자가 제거되는 방식으로 수행합니다. 다음 4열 슬롯에도 이 과정을 반복합니다.