Programing

두 텍스트 파일에서 줄을 인터리브하는 방법

crosscheck 2020. 10. 24. 09:37
반응형

두 텍스트 파일에서 줄을 인터리브하는 방법


두 개 (또는 그 이상)의 텍스트 파일을 인터리브하는 가장 쉽고 빠른 방법은 무엇입니까? 예:

파일 1 :

line1.1
line1.2
line1.3

파일 2 :

line2.1
line2.2
line2.3

인터리브 :

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

물론 둘 다 열고 작업을 수행하는 작은 Perl 스크립트를 작성하는 것은 쉽습니다. 그러나 나는 더 적은 코드, 아마도 유닉스 도구를 사용하는 한 줄의 코드로 벗어날 수 있는지 궁금합니다.


paste -d '\n' file1 file2

다음을 사용하는 솔루션은 다음과 같습니다 awk.

awk '{print; if(getline < "file2") print}' file1

다음 출력을 생성합니다.

line 1 from file1
line 1 from file2
line 2 from file1
line 2 from file2
...etc

awk출력에 추가 형식을 추가하려는 경우에 사용하면 유용 할 수 있습니다. 예를 들어 어떤 파일에서 오는지에 따라 각 행에 레이블을 지정하려는 경우 :

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1

다음 출력을 생성합니다.

1: line 1 from file1
2: line 1 from file2
1: line 2 from file1
2: line 2 from file2
...etc

참고 :이 코드는 file1이 file2보다 크거나 같은 길이라고 가정합니다.

file1에 file2보다 많은 줄이 포함되어 있고 file2가 완료된 후 빈 줄을 출력하려면 getline 테스트에 else 절을 ​​추가합니다.

awk '{print; if(getline < "file2") print; else print ""}' file1

또는

awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1

@Sujoy의 답변 은 유용한 방향으로 가리 킵니다. 줄 번호를 추가하고, 정렬하고, 줄 번호를 제거 할 수 있습니다.

(cat -n file1 ; cat -n file2 )  | sort -n  | cut -f2-

(나에게 관심이있는) 정적 파일 대신 서로 느리거나 빠르게 실행될 수있는 명령의 출력을 사용하는 경우 순서를 올바르게 지정하려면 약간 더 많은 작업이 필요합니다. 이 경우 줄 번호 외에 다른 태그를 추가 / 정렬 / 제거해야합니다.

(cat -n <(command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' )  \
   | sort -n  | cut -f2- | sort -n | cut -f2-

이를위한 GUI 방법은 다음과 같습니다. 스프레드 시트의 두 열에 붙여넣고 모든 셀을 복사 한 다음 정규식을 사용하여 탭을 줄 바꿈으로 바꿉니다.


cat file1 file2 |sort -t. -k 2.1

여기서 구분자는 "."로 지정되었습니다. 두 번째 필드의 첫 번째 문자를 기준으로 정렬합니다.

참고 URL : https://stackoverflow.com/questions/4011814/how-to-interleave-lines-from-two-text-files

반응형