2つのファイルの2つのフィールドの関連付け

2つのファイルの2つのフィールドの関連付け

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.txt2番目のファイルに対応する最初のファイルの行を印刷します。

接続(&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

関連情報