두 파일에서 대체 줄 병합


9

파일 1 :

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

파일 2 :

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

결과물 파일:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
제발 항상 운영 체제를 언급. 많은 표준 도구가 다른 OS에서 다르게 작동하므로 사용중인 것을 알아야합니다.
terdon

답변:




5

paste솔루션 은 가장 휴대 성이 뛰어나고 효율적입니다. 두 파일에 동일한 수의 줄이없는 경우 동작을 선호하는 경우에만이 대안을 언급합니다.

GNU로 sed:

sed Rfile1 file2

file1보다 적은 수의 라인이 있으면 file2, file1소진되면에 sed대한 빈 라인이 아닌 출력되지 않습니다 paste.

경우 file1보다 더 많은 라인이있다 file2(대한 빈 줄을 인쇄에 반대 한 후 그 여분의 라인이 삭제됩니다, file2와를 paste).

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

사용 awk( gawk, nawk, mawk) :

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNR현재 레코드 번호가 현재 파일 레코드 번호와 동일한 경우에만 일치하므로 (첫 번째 파일을 처리하는 동안에 만 일치) : 현재 처리 된 레코드를 x현재 파일 레코드 번호와 동일한 색인 의 배열 에 저장 하고 현재 기록
  • {print x[FNR]"\n"$0}: 배열의 내용을 x현재 파일 레코드 번호와 같은 색인에, 줄 바꿈과 현재 레코드의 내용을 인쇄합니다.
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

출력을 제공하지만 정확히 내가 원하는 것과 동일하지는 않습니다. tid.info 라인은 내 출력 파일에서 tid.setnr 라인 뒤에옵니다.
pmaipmui

@Nainita 그것은 당신이 당신의 예제 출력에 보여주는 것입니다.
kos

@Nainita 어쨌든 그냥 전환 할 수 있습니다 출력의 순서로 전환 file1하고 file2명령에 있습니다.
kos

예 ... 동일하게 수행했지만 이전과 똑같이 인쇄되었습니다. tid.setnr을 인쇄 한 후 tid.info를 자랑스럽게 생각했습니다.
pmaipmui

1
@ mikeserv 그러나 내가 그것에 있었기 때문에 나는 mawk또한 시도했다 . 어쨌든 나는 그것이 작동하지해야하는 이유를 볼 수없는 합리적인되는 단지 (즉, 다른 방법으로 주위를 단지 파일을 전환하여). awk입력에 신경 쓰지 않고 선은 선입니다. 그의 버전에서 지원되지 않는 것이 있다면 처음으로 깨졌을 것입니다. 더 쉽게, OP는 단순히 인수에서 입력 파일을 전환하는 실수를 범했습니다.
kos

-1

가장 쉬운 해결책은 다음과 같습니다.

cat file1 >> file2

또는

cat file2 >> file1

1
sachin, 질문을 다시 읽으십시오. 이것은 한 파일의 내용을 다른 파일의 내용에 추가합니다. 이 파일을 병합하지 않습니다 교류 (에서 그렇게 한 줄을 선을 file1에서 다음 한 줄 file2... 등등과)
don_crissti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.