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