줄 수가 다른 두 개의 txt 파일을 인터리브하는 방법

줄 수가 다른 두 개의 txt 파일을 인터리브하는 방법

파일 1.txt:

1
2
3
4
5
6

파일 2.txt:

A
B
C
D
E

원하는 출력 비율은 3:1(file3.txt)입니다.

1
2
3
A
4
5
6
B

내가 시도한 명령:

  1. sed Rfile2.txt file1.txt >file3.txt
  2. paste -d '\n' file1.txt file2.txt >file3.txt

답변1

그리고 paste:

paste -d '\n' <file1.txt - - - file2.txt

파일 중 하나가 소진된 후에도 다른 파일에 여전히 라인이 남아 있으면(예제에 표시된 대로) 라인을 계속 출력합니다.

그리고 awk:

awk '{print}; NR % 3 == 0 {getline < "file2.txt"; print}' file1.txt

또는 GNU에 sed상응하는 것:

sed '3~3 R file2.txt' file1.txt

이번에는 소진되면 중지되지만 file1.txt소진되면 계속됩니다(그리고 변형에서는 빈 줄을 출력하고 GNU 변형에서는 아무것도 출력하지 않습니다).file2.txtawksed

파일이 모두 소진되면 중지합니다.

awk '{print}
     NR % 3 == 0 {
       if ((getline < "file2.txt") <= 0) exit
       print
     }' file1.txt

답변2

$ awk '{print} (FNR % 3)==0{getline<"file2.txt"; print}' file1.txt
1
2
3
A
4
5
6
B

어떻게 작동하나요?

  • print

    그러면 file1.txt의 모든 줄이 인쇄됩니다.

  • (FNR % 3)==0{ getline <"file2.txt"; print}

    세 번째 줄마다 file2.txt에서 한 줄을 인쇄합니다.

선택하다

어떤 사람들은 awk 사용을 강력히 반대합니다 getline. 이 경우:

$ awk 'FNR==NR{a[NR]=$0;next} {print} (FNR % 3)==0{print a[FNR/3]}' file2.txt file1.txt
1
2
3
A
4
5
6
B

어떻게 작동하나요?

  • FNR==NR{a[NR]=$0;next}

    첫 번째 파일을 읽는 동안 file2.txt해당 행을 배열에 저장 a한 다음 나머지 명령을 건너뛰고 next입력 행으로 점프합니다.

  • print

    이 지점에 도달하면 두 번째 파일을 읽고 file1.txt해당 행을 인쇄합니다.

  • (FNR % 3)==0 {print a[FNR/3]}

    파일의 줄 번호가 file1.txt3의 짝수 배수 이면 file2.txt줄 번호가 현재 줄의 1/3인 파일의 줄을 인쇄합니다 file1.txt.

답변3

Python 사용:

암호:

with open(sys.argv[1], 'rU') as f1, open(sys.argv[2], 'rU') as f2:
    while f1 or f2:
        for i, line in enumerate(f1):
            print line.strip()
            if i == 2:
                break
        if f2:
            try:
                print(next(f2).strip())
            except StopIteration:
                f2 = None

결과:

1
2
3
A
4
5
6
B

관련 정보