파일이 2개 있는데..
첫 번째 파일 입력...
1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.
2 How many stairs in room?
A.6
B.10
C.15
D.23
Ans.
두 번째 파일 입력...
1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.
2. Which day is today ?
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.
다음과 같은 출력이 필요합니다 ...
1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.
1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.
2 How many stairs in room?
A.6
B.10
C.15
D.23
Ans.
2. Which day is today ?
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.
명령어를 사용하고 있는데...
sed -e '/Ans./{r file2' -e:n -e 'n;bn' -e \} file1
하지만 2의 두 번째 o/p는 반대입니다.
1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.
1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.
**2. Which day is today ?**
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.
**2 How many stairs in room?**
A.6
B.10
C.15
D.23
답변1
awk
단락 모드에서 이것을 사용하면 매우 가까워질 수 있습니다 getline
(레코드 구분 기호를 완전히 보존하지 않습니다. 변수를 사용하여 더 나은 작업을 수행하는 GNU awk를 사용할 수 있습니다 RT
).
$ awk 'BEGIN{RS=""; ORS="\n\n"} {print; if( (getline < "second") > -1) print}' first
1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.
1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.
2 How many stairs in room?
A.6
B.10
C.15
D.23
Ans.
2. Which day is today ?
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.
답변2
당신은 이것을 달성할 수 있습니다awk
awk -v RS='' '
FNR == NR { block[NR] = $0; next }
{ print block[FNR] "\n\n" $0 "\n" }
' file1 file2
블록은 빈 줄( )로 구분됩니다 RS=''
. 첫 번째 줄( FNR == NR
)은 청크를 배열 file1
에 저장합니다. block
의 각 블록에 대해 file2
두 번째 줄은 의 해당 블록을 인쇄한 file1
다음 의 블록을 인쇄 합니다 file2
.
노트:
- 각 파일에 동일한 수의 텍스트 블록이 포함되어 있다고 가정합니다.
- 적절한 형식을 지정하려면 각 파일의 마지막 블록 뒤에 빈 줄이 와야 합니다.
각 파일에 블록 수가 다른 경우 다음은 bash
GNU 도구 sed
와 다음을 사용하는 (해키적인) 솔루션입니다 paste
.
paste -z -d '\n' <(sed -z 's/\n\n/\n\x00/g' file1) <(sed -z 's/\n\n/\n\n\x00/g' file2)
이 sed
명령은 블록 구분 기호(빈 줄)에 0바이트를 추가합니다. paste
해당 0바이트를 구분 기호로 사용하고 각 청크를 차례로 인쇄하여 새 줄로 구분합니다.
답변3
다음은 표준 유틸리티 붙여넣기 사용을 보여주는 스크립트 및 출력입니다. 첫 번째는 두 개의 별도 파일에서 줄을 번갈아 붙여넣는 간단한 경우입니다. 그런 다음 우리가 해야 할 일은 단락과 섹션을 한 줄에 입력하고 붙여넣기 방법을 사용하는 것입니다. 그룹의 행을 "슈퍼라인"으로 모으는 것은 개행 문자를 다른 문자(이 경우 "@")로 대체하여 각 행을 변환하는 짧은 Perl 스크립트를 사용하여 수행됩니다. 그런 다음 붙여넣은 다음 슈퍼라인을 단락으로 다시 나눕니다. 대부분의 *nix 명령이 라인 수준에서 작동하기 때문에 이는 유용한 기술입니다. 사실, 우리 매장에는 이러한 슈퍼 라인을 만들 수 있는 유틸리티 "마술리"가 있을 정도로 유용합니다.
시각적 공간을 절약하기 위해 데이터 파일의 크기가 더 작습니다.
#!/usr/bin/env bash
# @(#) s1 Demonstrate modular approach to multi-line data, perl, paste.
# Utility functions: print-as-echo, print-line-with-visual-space, debug.
# export PATH="/usr/local/bin:/usr/bin:/bin"
LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
em() { pe "$*" >&2 ; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C paste perl
pl " Input data file data[12]:"
head data[12]
pl " Results, proof of concept:"
paste -d'\n' data[12]
pl " Input data files data[34]:"
head data[34]
pl " Results, collect, paste, separate:"
paste -d'\n' <( perl -00 -wp -e 's/\n/@/g;s/@@/=\n/' data3 ) \
<( perl -00 -wp -e 's/\n/@/g;s/@@/=\n/' data4 ) |
tee f1 |
perl -000 -wp -e 's/@/\n/g;s/=/\n\n/g;s/\n\n\n/\n\n/g'
exit 0
생산:
$ ./s1
Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution : Debian 8.9 (jessie)
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23
perl 5.20.2
-----
Input data file data[12]:
==> data1 <==
1.1
1.2
==> data2 <==
2.1
2.2
-----
Results, proof of concept:
1.1
2.1
1.2
2.2
-----
Input data files data[34]:
==> data3 <==
3.1a
3.1b
3.2a
3.2b
==> data4 <==
4.1a
4.1b
4.2a
4.2b
-----
Results, collect, paste, separate:
3.1a
3.1b
4.1a
4.1b
3.2a
3.2b
4.2a
4.2b
행운을 빕니다... 건배, drl