t1.txt
という2つのファイルがありますt2.txt
。内容は次のとおりです。
t1.txt
a
b
c
t2.txt
ab
bc
cd
t3.txtが次のように見えるように、これらの2つのファイルを1行ずつt3.txtにマージしようとしています。
t3.txt
aab
bbc
ccd
シェルスクリプトを使用して出力を取得するのに役立ちます。
答え1
貼り付け sed
より効率的な方法がありますが、ここにおよびpaste
を使用する迅速で汚れた方法がありますsed
。
$ paste -d":" t1.txt t2.txt | sed 's/://g'
aab
bbc
ccd
両方のファイルは以下のように上からリンクされています。
a:ab
b:bc
c:cd
そしてsed
削除されました:
。
ただ貼り付け
使用を放棄できます。ファイルを結合するときにsed
区切り文字として何も使用しないように言うのは少し冗長です。paste
$ paste -d "" t1.txt t2.txt
aab
bbc
ccd
アッ
awk
次の方法を使用してこれを実行することもできます。
$ awk 'NR==FNR{a[FNR]=$0;next} {print a[FNR] $0}' t1.txt t2.txt
aab
bbc
ccd
これは最初のファイルを繰り返し配列t1.txt
に保存しますa[FNR]
。FNR
ファイル内の各行の行番号に基づく配列のインデックスt1.txt
。次に、2番目のファイルを繰り返して、t2.txt
2番目のファイルに対応する最初のファイルの行を印刷します。
接続(&A)&nl
この方法は少し複雑ですが、効果的で使用中に重いものを持ち上げるのはあまりawk
複雑ではありません。
$ join <(nl t1.txt) <(nl t2.txt)|awk '{print $2 $3}'
aab
bbc
ccd
次のnl ...
コマンドは、行番号を含むテストファイルのバージョンを生成します。
$ nl t1.txt
1 a
2 b
3 c
その後、コマンドjoin
はその行番号を2つのファイルに共通のデータフラグメントとして使用して結合できます。
$ join <(nl t1.txt) <(nl t2.txt)
1 a ab
2 b bc
3 c cd
awk
最後に、上記の2番目と3番目の列を抽出するために使用します。
プロモーションとawk
ほとんど使用されないこのpr
コマンドは、マージスイッチを介してファイルをリンクするためにも使用できます-m
。
$ pr -t -m t1.txt t2.txt | awk '{print $1 $2}'
aab
bbc
ccd
答え2
paste -d '\0' t1.txt t2.txt > t3.txt
いいえ、2つのファイルの間にNUL文字が含まれていません。
はい、標準(POSIX)であり、移植可能で最も効率的です。
答え3
追加のテキスト処理ツールなしでBASHシェルで実行してみてください。
exec 3< t1.txt
exec 4< t2.txt
while read l1 <&3 && read l2 <&4; do
echo ${l1}$l2
done > t3.txt