구분 기호 삼중 파이프 기호 "|||"를 사용하여 두 파일을 한 줄씩 병합합니다.

구분 기호 삼중 파이프 기호 "|||"를 사용하여 두 파일을 한 줄씩 병합합니다.

두 언어 모두 동일한 줄 수의 두 개의 병렬 파일이 있고 구분 기호를 사용하여 두 파일을 한 줄씩 병합할 계획입니다 |||. 예를 들어 다음과 같은 두 파일이 있습니다.

파일 A:

1Mo 1,1 I love you.
1Mo 1,2 I like you.
Hi 1,3 I am hungry.
Hi 1,4 I am foolish.

파일 B:

1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.
Hi 1,3 Ich habe Durst.
Hi 1,4 Ich bin neu.

예상되는 출력은 다음과 같습니다.

1Mo 1,1 I love you. ||| 1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. ||| 1Mo 1,2 Ich mag dich.
Hi 1,3 I am hungry. ||| Hi 1,3 Ich habe Durst.
Hi 1,4 I am foolish. ||| Hi 1,4 Ich bin neu.

paste다음 명령을 시도했습니다 .

paste -d "|||" fileA fileB

그러나 반환된 출력에는 파이프만 포함됩니다. 예를 들면 다음과 같습니다.

1Mo 1,1 I love you. |1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. |1Mo 1,2 Ich mag dich.

트라이프 튜브를 사용하여 각 쌍의 전선을 분리하는 방법이 있습니까 |||?

답변1

그리고POSIX 붙여넣기:

:|paste -d ' ||| ' fileA - - - - fileB

paste모든 입력 파일의 해당 행이 연결됩니다. 여기에는 6개 파일, fileA표준의 4개 더미 파일 -, fileB.

구분 기호 목록은 공백, 세 개의 파이프 및 공백으로 구성되며 이 순서대로 paste루프에 사용됩니다.

6개 파일 중 첫 번째 줄의 경우 fileA첫 번째 더미 파일이 연결됩니다. (아무것도 아닙니다. 감사합니다.조치 없음:연산자), 생성합니다 line1-fileA<space>.

첫 번째 가상 파일은 파이프를 통해 두 번째 가상 파일인 Produce로 연결되고, line1-fileA |두 번째 가상 파일은 세 번째 가상 파일인 Produce로 연결되고, line1-fileA ||세 번째 가상 파일은 네 번째 가상 파일인 Produce로 연결됩니다 line1-fileA |||.

네 번째 가상 파일은 fileB,생성됩니다 line1-fileA ||| line1-fileB.

이러한 단계는 모든 행에 대해 반복되어 예상한 결과를 제공합니다.


타이핑을 줄이는 데 사용 되며 :|주로 대화형 쉘에서 사용됩니다. 스크립트에서는 다음을 사용해야 합니다.

</dev/null paste -d ' ||| ' fileA - - - - fileB

서브쉘이 생성되는 것을 방지합니다.

답변2

글쎄, 이것은 sed, awk 또는 grep을 사용하지 않지만 bash에서 쉽게 할 수 있습니다. 명령은 다음과 같습니다:

(while IFS= read -r a <&3 && IFS= read -r b <&4; do echo "$a ||| $b"; done) 3<fileA 4<fileB

붙여넣기의 문제점은 구분 기호가 단일 문자라는 것입니다. 단일 문자를 삽입하고 sed를 사용하여 변환할 수도 있지만 문자가 이미 입력 파일에 나타나면 오류가 발생하기 쉽습니다.

답변3

awk(GNU) 버전

awk '{printf ("%s ||| ", $0); getline < "fileB"; print $0 }' fileA

getline의 명령을 사용하면 지정된 파일에서 다음 레코드를 설정하면 다음 입력 레코드에서 (해당 열의 모든 변수)를 설정할 awk수 있습니다 .$0getline < "filename"$0

getline < "file" 파일 세트 NF의 다음 레코드부터 시작하여 $0을 설정합니다.


왜 당신의 시도가 기대만큼 잘 되지 않았나요? 이것으로부터 man paste우리는 읽을 수 있습니다

-d, --delimiters=LIST
     reuse characters from LIST instead of TABs

하지만각 열에 구분 기호를 사용합니다..

그래서 명령이
paste -d '|*|*' fileA fileB fileA fileB나에게 제공하는 줄은 다음과 같습니다

Hi 1,3 I am hungry.|Hi 1,3 Ich habe Durst.*Hi 1,3 I am hungry.|Hi 1,3 Ich...
Hi 1,4 I am foolish.|Hi 1,4 Ich bin neu.*Hi 1,4 I am foolish.|Hi 1,4 Ich...


sed이 솔루션 은 원래 시도에 가깝더라도 획득한 동작을 원래 목적으로 다시 패치하므로 피하는 것이 좋습니다 .

 paste -d '|' fileA fileB | sed 's/|/|||/g'

|모든 패턴을 새로운 패턴으로 교체하기 때문에 이를 방지하려면 |||,|하지만 파이프 기호( )가 데이터에 존재하지 않는다고 가정해야 합니다.그렇지 않으면 특별한 경우를 처리하고 부작용을 피하기 위해 더 복잡한 코드를 작성해야 합니다.


다음과 같은 변형여기 문자열[1] 건설하다<<<

 paste -d ' ||| ' fileA - - - - fileB  <<< ''

빈 문자열에서 데이터를 가져오는 5개의 구분 기호 -d ' ||| '(공백, |, |, |, 공백)와 4개의 더미 파일( )을 설정합니다 .- - - -''


GNU Awk 4.0.1, 붙여넣기(GNU coreutils) 8.21 및 sed(GNU sed) 4.2.2에서 테스트되었습니다.

답변4

Python에서도 이런 방식으로 할 수 있습니다.

lines1 = [ line.rstrip() for line in open("file1") ]
lines2 = [ line.rstrip() for line in open("file2") ]
for i in xrange((len(lines1))): print lines1[i] + " ||| " + lines2[i]
... 
1Mo 1,1 I love you. ||| 1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. ||| 1Mo 1,2 Ich mag dich.
Hi 1,3 I am hungry. ||| Hi 1,3 Ich habe Durst.
Hi 1,4 I am foolish. ||| Hi 1,4 Ich bin neu.

관련 정보