短い答え

短い答え

私は通常unix / bash / codeを初めて使用しており、異なるディレクトリにある同じ名前の複数のサンプルファイルを独自のディレクトリ(複数のデータセットの出力)にある新しいファイルにマージしようとしています。

そのために、listA(各サンプルファイルの名前)とlist B(新しくマージされたサンプルファイルの名前)の2つの配列を使用するスクリプトを作成しました。

私のコードは次のとおりです。

#!/bin/sh

listA=( old1 old2 old3 etc.)
listB=( new1 new2 new3 etc.)

i=0

for i in $listA $listB

do

cp ./folder1/$listA ./merged/$listB
cat ./folder2/$listA >> ./merged/$listB
cat ./folder3/$listA >> ./merged/$listB
cat ./folder4/$listA >> ./merged/$listB

((i=+1))

done
echo "Done stitching"

そのままlistAの最初の項目のファイルをlistBの最初のファイルに完全にマージするように見えますが、リストの後続の項目のプロセスを繰り返すことはありません。

これを期待どおりに実行するための提案はありますか?私の無知についてお詫び申し上げます。私はこのすべてが初めてで、学習プロセスを本当に楽しんでいます。ちょっと混乱しているだけです。

ベストアンサー1

短い答え

while IFS=$'\t' read -r old new; do cat folder*/"$old" > merged/"$new"; done <list.tsv

これはlist.tsv、タブ区切りのソース(古い)ファイルとターゲット(新しい)ファイルのリストを想定しています。

説明する

  • while IFS=$'\t' read -r old new; FOO; done <list.tsvlist.tsv:これは各行を読み取り、各行FOOで操作を実行する一般的なシェル構成です。この場合、入力ファイルの区切り文字IFSはtabです$'\t'。つまり、行の最初のフィールドはに保存され、$old2番目のフィールド(タブの後ろ)はに保存されます$new
  • cat folder*/"$old" > merged/"$new":ファイルをリンクしてfolder*/"$old"書き込みます。これはmerged/"$new"ソースファイルがすべてにあると仮定しますfolder*folder1folder2
  • 他のスクリプトと同様に、実行する前に必ずテストしてみましょう。ファイルのサブセットを別のディレクトリにコピーしてから、短いバージョンの入力リストを使用してこれを実行できますlist.tsv。結果を確認し、可能であれば実際に実行してみてください(ただしバックアップを維持してください!)。

提案されたソリューションに関する注意事項

私は、さまざまなコマンドがどのように機能するかを明確にするために、あなたが提案した解決策についていくつかのコメントを書きたいと思いました。これがあなたの理解に役立つことを願っています!

  • listA=( old1 old2 old3 etc.)。これで配列が作成されます。一部のコンテンツにアクセスする方法を示します。ここ。 (ある程度)観察したように、を使用するとfor i in $listA…最初の項目にのみアクセスします。
  • for i in a b c。これはabとを繰り返してcそれぞれに入れます$i。たとえば、ブロック内で参照するfor i in a b c; do echo $i; doneことは$listA意味がありませんdo…done。同様にi=0((i=+1))使用法も一致しません。for
  • ./folder1/$listA./不要です。.は現在のフォルダなので、ここでは何もしません。
  • cat FOO >>cat独自にリンクされます(したがって名前)。ファイルに追加された別のステートメントを作成する必要はありませんcat。たとえば、>>後ろに複数のファイルを一覧表示できます。catcat file1 file2 file3 > output_file

おすすめ記事