2つのファイルのテキストを同時に処理したい。
fname3=XX1.txt fname2=XX2.txt
while read -r -u3 line1; read -r -u4 line2; do
echo "$line1:$line2";
done 3< "$fname3" 4< "$fname2"
出力には常に「:(テキスト)」が表示されますが、「(テキスト):(テキスト)」が出力されると思います。ファイルは大きいですが、重要ですか?
これは、任意のサイズのファイルに投稿されたとおりに正常に機能します。これは、100万行のファイルに対してデモを行う完全な自己完結型のスクリプトです。
#!/bin/bash
printf "foo%s\n" {1..1000000} > XX1.txt
printf "bar%s\n" {1..1000000} > XX2.txt
fname3=XX1.txt fname2=XX2.txt
while read -r -u3 line1; read -r -u4 line2; do
echo "$line1:$line2";
done 3< "$fname3" 4< "$fname2"
出力は次のとおりです。
foo1:bar1
foo2:bar2
...
foo999999:bar999999
foo1000000:bar1000000
最初のファイルが2番目のファイルより短い場合、残りの最後の行は:line
2番目のファイルが完全に読み取られるまで続きます。2番目のファイルが短い場合、スクリプトは完了すると停止し、最初のファイルの残りの部分を無視します。
ファイルの行がなくなったときに停止するには、&&
代わりにを使用;
してreadステートメントを区切ります。両方のファイルの行がなくなるまで読み取るには、を使用します||
。
対応する行を連結するだけの場合は、次を使用しますpaste
。
paste -d : $fname3" "$fname2"