
ファイルが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.
2番目のファイルを入力してください...
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の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
2行目はそのブロックを印刷し、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
コマンドは、ブロック区切り記号(空白行)にゼロバイトを追加します。paste
対応するゼロバイトを区切り文字として使用し、各チャンクを順番に印刷して新しい行に分割します。
答え3
以下は、標準ユーティリティの貼り付けの使用を示すスクリプトと出力です。 1つ目は、2つの別々のファイルから行を交互に貼り付ける簡単なケースです。それから私たちがしなければならないのは、段落とセクションを1行に入力して貼り付ける方法を使用することです。グループの行を「スーパーライン」に集めることは、改行文字を別の文字(この場合は「@」)に置き換えて各行を変換する短い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