paste
元のファイル"first.xls"に新しい列を追加するために使用したいと思います。私のファイル:
first.xls
1
1
1
second.xls
2
2
2
私は以下を使用しています:
paste -d'\t' first.xls second.xls >> first.xls
私は得る
first.xls
:
1
1
1
1 2
1 2
1 2
しかし、私が望むものは
first.xls
:
1 2
1 2
1 2
first.xls
最初から上書きしたい新しいファイルに保存したくありません。スクリプトを実行するたびに新しい列が追加されるように、新しい列を最終結果に貼り付けたいので、これが必要です。
1 2 2
1 2 2
1 2 2
それから
1 2 2 2
1 2 2 2
1 2 2 2
など...
答え1
使用スポンジ~からその他のユーティリティパック:
paste -d'\t' first.xls second.xls | sponge first.xls
man sponge
スポンジ標準入力を読み取り、指定されたファイルに書き込みます。シェルリダイレクトとは異なり、スポンジは出力ファイルを開く前にすべての入力を吸収します。これにより、同じファイルを読み書きするパイプを制限できます。
答え2
私はあなたがこれを一人でできるとは思わないpaste
。
私はそうします:
paste -d' ' first.txt second.txt > tmpout && mv tmpout first.txt
最初の実行後の結果:
cat first.txt
1 2
1 2
1 2
2回目の実行後:
cat first.txt
1 2 2
1 2 2
1 2 2
...3回目の実行:
cat first.txt
1 2 2 2
1 2 2 2
1 2 2 2
答え3
代替ソリューションawk
$ seq 3 > first.xls
$ seq 4 6 > second.xls
$ awk -v OFS="\t" 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0 > "first.xls"}' first.xls second.xls
$ cat first.xls
1 4
2 5
3 6
$ awk -v OFS="\t" 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0 > "first.xls"}' first.xls second.xls
$ cat first.xls
1 4 4
2 5 5
3 6 6
答え4
もう一つの答えが示すように、スポンジは仕事に適したツールです!
sudo yum install moreutils
paste first.xls second.xls | sponge first.xls
teeを使用したbashコマンドは、小さなファイル(<2048行)で機能します。
注:このヒントは大きなファイルには適用されません。
paste first.xls second.xls | tee first.xls >/dev/null
first.x second. result
1 2 1 2
1 2 1 2
1 2 1 2
このコマンドは両方のファイルに対して貼り付けを実行し、「tee」にパイプします。teeコマンドは、書き込み用にファイル(および標準出力)を再度開きます。。だから動作します。 。しかし、それは少しハッキングのようです。 。すべてのシステムで動作しますか?大容量ファイルにも適用されますか?
まったく同じではありませんが、関連する質問をここで確認してください。 https://stackoverflow.com/questions/1569730/paste-without-temporary-files-in-unix
問題は、コマンドが同時に書き込み(追加)と読み取りのためにfirst.xlsを開くことです。ファイルからデータを読み取り、他のファイルと貼り付けます。その後、出力データがファイルに書き込まれます(追加)。新しく作成されたデータを再読み込みし、期待どおりに追加します。追加コマンド:
paste first.xls second.xls >> first.xls
first.x second. result
1 2 1
1 2 1
1 2 1
1 2
1 2
1 2
オーバーレイをオンにするようにリダイレクトを変更しても機能しません。読み込み前に first.xls が開いて消去されます。空の列+ 2つの列が表示されます。追加の代わりに上書きは機能しません。
paste first.xls second.xls > first.xls
first.x second. result
1 2 2
1 2 2
1 2 2
より大きなファイルテスト
1000行に有効:
yes "1" | fmt -2 |head -1000 >1000.1
yes "2" | fmt -2 |head -1000 >1000.2
paste 1000.1 1000.2 |tee 1000.1 >/dev/null
uniq -c 1000.1
1000 1 2
10000行目で同様の問題が再び表示され始めます。:
興味深いことに、2048行以降にこの内容が表示されます。 :-) ディスクバッファ制限またはパイプバッファ制限が原因であると推測されます。 。 。
yes "1" | fmt -2 |head -10000 >10000.1
yes "2" | fmt -2 |head -10000 >10000.2
paste 10000.1 10000.2 |tee 10000.1 >/dev/null
uniq -c 10000.1
2048 1 2
7952 2